c# - 如何结合 TaskCompletionSource 和 CancellationTokenSource?

标签 c# asynchronous async-await cancellationtokensource taskcompletionsource

我有这样的代码(此处已简化)等待完成任务:

var task_completion_source = new TaskCompletionSource<bool>();
observable.Subscribe(b => 
   { 
      if (b) 
          task_completion_source.SetResult(true); 
   });
await task_completion_source.Task;    

想法是订阅并等待 bool 值流中的 true。这完成了“任务”,我可以继续超越 await

但是我想取消 -- 但不是订阅,而是等待。我想将取消 token (以某种方式)传递给 task_completion_source,因此当我取消 token 源时,await 将继续。

怎么做?

更新:CancellationTokenSource 在这段代码之外,我这里只有来自它的 token 。

最佳答案

如果我理解正确的话,你可以这样做:

using (cancellationToken.Register(() => {
    // this callback will be executed when token is cancelled
    task_comletion_source.TrySetCanceled();
})) {
    // ...
    await task_comletion_source.Task;
}

请注意,它会在您的 await 上抛出异常,您必须处理该异常。

关于c# - 如何结合 TaskCompletionSource 和 CancellationTokenSource?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39897151/

相关文章:

java - AtomicInteger 的 check-then-act 用法是否需要同步?

c# - 异步/等待功能比较

c# - 使用 RegisterHotKey 检测 Ctrl+V 但不拦截它

c# - 使用 LINQ 对 XML 进行排序

c# - 如何在 MVC 5 中使用 .NET Identity 2.0 获取在线用户数

javascript - 在页面加载时使用 async/defer 加载多个 Jquery 文件

c# - 如何强制 <a> 链接到文件触发浏览器中的下载(并且不打开)

Python 相当于 Perl 的 HTTP::Async->next_response

c# - 任务扩展以迎合应用范围内的服务调用

javascript - 使用 Mongoose promise /异步等待,返回空数组