在Xamarin.iOS中长时间延迟的Task.Delay()

时间:2018-09-07 08:14:09

标签: multithreading timer xamarin.ios async-await delayed-execution

我有一个特殊的要求,我必须在 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();
}

这将在我期望的新时间间隔之后调用下一个线程。

现在,我的查询如下:

  1. 是否还有其他方法可以使线程大部分时间不处于延迟状态?
  2. 它是否以任何方式妨碍了App的性能?考虑到至少有一个后台线程处于延迟状态。

1 个答案:

答案 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.
    }
}