Task.Wait()
- это не тот метод, который вы хотите использовать, когда у вас есть какие-либо альтернативы. Он синхронно блокирует асинхронную операцию, потребляя поток и, возможно, блокируя пользовательский интерфейс.
Вместо этого вы можете await
the 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.
}
}