Task.Delay()在Xamarin.iOS中有很长的延迟

问题描述 投票:0回答:1

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

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

现在,我的查询如下:

  1. 有没有其他方法可以通过大多数时间没有线程处于延迟状态来实现这一点?
  2. 它是否以任何方式妨碍App性能?考虑到最后一个后台线程处于延迟状态。
multithreading timer xamarin.ios async-await delayed-execution
1个回答
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.
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.