为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

互换的青春 2019-06-15 11:36:25
异步等待任务<T>完成超时我想等一个任务<T>为了完成一些特殊的规则:如果在X毫秒之后还没有完成,我想向用户显示一条消息。如果在Y毫秒之后还没有完成,我想自动请求取消.我可以用任务,继续异步等待任务完成(即,在任务完成时安排要执行的操作),但这不允许指定超时。我可以用任务等等同步等待任务以超时方式完成,但这会阻塞我的线程。我如何异步地等待超时任务的完成?
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

下面是一个扩展方法版本,它包含了取消原来任务完成时的超时,正如AndrewArnott在注释中建议的那样他的回答.

public static async Task<TResult> TimeoutAfter<TResult>(this Task<TResult> task, TimeSpan timeout) {

    using (var timeoutCancellationTokenSource = new CancellationTokenSource()) {

        var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
        if (completedTask == task) {
            timeoutCancellationTokenSource.Cancel();
            return await task;  // Very important in order to propagate exceptions
        } else {
            throw new TimeoutException("The operation has timed out.");
        }
    }}


查看完整回答
反对 回复 2019-06-15
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

你可以用Task.WaitAny等待多个任务中的第一个任务。

您可以创建两个额外的任务(在指定的超时之后完成),然后使用WaitAny等待先完成。如果首先完成的任务是您的“工作”任务,那么您就完成了。如果首先完成的任务是超时任务,那么您可以对超时(例如请求取消)作出反应。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 757 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信