我想用一些特殊规则等待Task完成:如果 X 毫秒后还没有完成,我想向用户显示一条消息。如果 Y 毫秒后还没有完成,我想自动请求取消。
我可以使用Task.ContinueWith异步等待任务完成(即安排在任务完成时执行的操作),但这不允许指定超时。我可以使用Task.Wait同步等待任务超时完成,但这会阻塞我的线程。如何异步等待任务超时完成?
这个怎么样:
int timeout = 1000; var task = SomeOperationAsync(); if (await Task.WhenAny(task, Task.Delay(timeout)) == task) { // task completed within timeout } else { // timeout logic }
另外 :应对我的回答发表评论的要求,这是一个扩展的解决方案,其中包括取消处理。请注意,将取消传递给任务和计时器意味着在您的代码中可以通过多种方式体验取消,您应该确保测试并确信您正确处理了所有这些。不要冒险进行各种组合,并希望您的计算机在运行时做正确的事情。
int timeout = 1000; var task = SomeOperationAsync(cancellationToken); if (await Task.WhenAny(task, Task.Delay(timeout, cancellationToken)) == task) { // Task completed within timeout. // Consider that the task may have faulted or been canceled. // We re-await the task so that any exceptions/cancellation is rethrown. await task; } else { // timeout/cancellation logic }