异步等待任务<T>完成超时

异步等待任务<T>完成超时

我想等一个任务<T>为了完成一些特殊的规则:如果在X毫秒之后还没有完成,我想向用户显示一条消息。如果在Y毫秒之后还没有完成,我想自动请求取消.

我可以用任务,继续异步等待任务完成(即,在任务完成时安排要执行的操作),但这不允许指定超时。我可以用任务等等同步等待任务以超时方式完成,但这会阻塞我的线程。我如何异步地等待超时任务的完成?


互换的青春
浏览 758回答 3
3回答

摇曳的蔷薇

下面是一个扩展方法版本,它包含了取消原来任务完成时的超时,正如AndrewArnott在注释中建议的那样他的回答.public&nbsp;static&nbsp;async&nbsp;Task<TResult>&nbsp;TimeoutAfter<TResult>(this&nbsp;Task<TResult>&nbsp;task,&nbsp;TimeSpan&nbsp;timeout)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(var&nbsp;timeoutCancellationTokenSource&nbsp;=&nbsp;new&nbsp;CancellationTokenSource())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;completedTask&nbsp;=&nbsp;await&nbsp;Task.WhenAny(task,&nbsp;Task.Delay(timeout,&nbsp;timeoutCancellationTokenSource.Token)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(completedTask&nbsp;==&nbsp;task)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeoutCancellationTokenSource.Cancel(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;await&nbsp;task;&nbsp;&nbsp;//&nbsp;Very&nbsp;important&nbsp;in&nbsp;order&nbsp;to&nbsp;propagate&nbsp;exceptions &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TimeoutException("The&nbsp;operation&nbsp;has&nbsp;timed&nbsp;out."); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}

德玛西亚99

你可以用Task.WaitAny等待多个任务中的第一个任务。您可以创建两个额外的任务(在指定的超时之后完成),然后使用WaitAny等待先完成。如果首先完成的任务是您的“工作”任务,那么您就完成了。如果首先完成的任务是超时任务,那么您可以对超时(例如请求取消)作出反应。
打开App,查看更多内容
随时随地看视频慕课网APP