我有一个特殊的要求,我必须在 Xamarin.iOS 中不断更改时间间隔之后调用后台线程。我首先尝试使用this page中所述的Timer类来实现它,但是我无法无限期地更改时间间隔。
因此,我实现了以下解决方案:
void SomeUIMethod()
{
while (true)
{
await Task.Run(PerformSync);
}
}
...
private async Task PerformSync()
{
var newInterval = SomeBackgroundTask();
Task.Delay(newInterval*1000).Wait();
}
这将在我期望的新时间间隔之后调用下一个线程。
现在,我的查询如下:
答案 0 :(得分:0)
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.
}
}