我有一个特定的要求,我必须在Xamarin.iOS不断变化的时间间隔后调用后台线程。我首先尝试使用Timer类实现它,如this page中所述,但我不能无限次地改变时间间隔。
所以,我已经实现了以下解决方案:
void SomeUIMethod()
{
while (true)
{
await Task.Run(PerformSync);
}
}
...
private async Task PerformSync()
{
var newInterval = SomeBackgroundTask();
Task.Delay(newInterval*1000).Wait();
}
这将按照我的预期在新的时间间隔之后调用下一个线程。
现在,我的查询如下:
当你有任何其他选择时,Task.Wait()
不是你想要使用的方法。它同步阻止异步操作,消耗线程并可能使UI死锁。
相反,你可以await
Task
:
private async Task PerformAsync()
{
while(true)
{
var newInterval = SomeBackgroundTask();
await Task.Delay(newInterval * 1000);
}
}
这将无限循环,循环之间有延迟,但线程在每次循环后释放。
此外,永远有一些循环通常是有问题的。您可能希望它在某个时刻停止。这是使用CancellationToken
表示你想放弃循环的一个很好的候选者。
private async Task PerformAsync(CancellationToken cancellationToken)
{
try
{
while(!cancellation.IsCancellationRequested)
{
var newInterval = SomeBackgroundTask();
await Task.Delay(newInterval * 1000, cancellationToken);
}
}
catch (OperationCanceledException ex) when (cancellation.IsCancellationRequested)
{
// Swallow the exception and exit the method.
}
}