何时打破断开的While循环



我有一个while循环,等待本地设置值不再为null。在某些东西被borked并且值保持为null的情况下,是否有某种最佳实践可以帮助您打破循环?现在我只让它计数到100,如果它循环100次就可以打破循环:

int i = 0;
while (ApplicationData.Current.LocalSettings.Values["MediaInfoSaved"] == null)
{
await Task.Delay(15);
i++;
if(i >= 100)
{
break;
}
}

循环正在等待完全信任帮助程序中的进程完成并返回其结果。这个过程有时可能需要一段时间才能完成(0.1-1秒(。

将值(在代码中表示为100(放入配置文件中,以便在需要时轻松更改。如果稍后出现问题,您可以根据需要进行调整。

如果进程预计需要一秒钟的时间,请等待一秒钟。无需循环和递增计数器:

private async Task<object> GetLocalSettingAsync()
{
const string SettingName = "MediaInfoSaved";
// Try to get the value immediately:
var setting = ApplicationData.Current.LocalSettings.Values[SettingName];
if (setting != null)
return setting;
// Wait for one second only.
await Task.Delay(TimeSpan.FromSeconds(1));
// Return either a value or null.
return ApplicationData.Current.LocalSettings.Values[SettingName];
}

如果你想尽快退出,但等待一秒钟,然后旋转一个循环并轮询属性:

private async Task<object> GetLocalSettingAsync()
{
const string SettingName = "MediaInfoSaved";
DateTime start = DateTime.UtcNow;
object setting;
do
{
setting = ApplicationData.Current.LocalSettings.Values[SettingName];
if (setting != null)
break;
//optionally wait here:
await Task.Delay(15);
} while (DateTime.UtcNow.Subtract(start).TotalSeconds < 1);
return setting;
}

恐怕情况不会好转,除非您正在监视的对象在有可用数据时引发某种事件或回调。

实现超时是一种非常常见的做法,即在脱离循环之前等待指定的时间(如果您知道进程应该花多长时间(。这基本上就是您所实现的。如果你认为完成不应该超过1秒,请确保它在1.5-2秒后打破循环。可能有更有效的方法来实现这一点,比如使用系统内的实际时间。

最新更新