首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TaskCompletionSource使用

TaskCompletionSource使用
EN

Stack Overflow用户
提问于 2015-04-22 05:52:23
回答 1查看 2.4K关注 0票数 2

如果取消了完成源,在结果变量中我会收到什么?

代码语言:javascript
复制
async void SomeMethod()
{
   .....
   Run();
   var result = await GetResult();
   .....
}

Task<SomeResult> GetResult()
{
    return myCompletionSource.Task;
}

TaskCompletionSource myCompletionSource;

void Run()
{
     myCompletionSource= new TaskCompletionSource();
     TriggerSomeLongLastingLogicWhichWillCallCallBackBelow();

}

void SomeCallback()
{
     if (someCondition)
     {
         myCompletionSource.SetResult(<someResult>);
     }
     else
     {
         myCompletionSource.SetCancelled();
     }
}

我不太确定这种方法是否正确。

  1. 换句话说,依赖任务状态而不是为带有状态变量的“翻转”创建包装器是一种良好的实践吗?
  2. 如何处理取消的任务?我不喜欢回调,也不喜欢用ContinueWith解决方案,在那里我可以分析任务状态。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-22 07:01:21

如果取消了完成源,在结果变量中我会收到什么?

在等待取消的任务时,代码将抛出一个OperationCancelledException。因此,结果变量将永远不会被设置。

您可以使用try/catch块处理异常:

代码语言:javascript
复制
async Task SomeMethod()
{
   try
   {
       .....
       Run();
       var result = await GetResult();
   }
   catch(OperationCancelledException)
   {
       // handle cancelled operation
   }
}

此外,SomeMethod应该返回一个Task,因为void返回的async方法通常只适用于事件处理程序,因为它们必须返回void。我在博客上对此做了简要的介绍,这里

通常,如果您希望一个操作是可取消的,则需要传入一个CancellationToken,该操作必须检查该操作并将其传递给它启动的其他操作。所以你一直把它传递给你的回收站。

您还可以向CancellationToken注册一个回调,当令牌被取消时,该回调会取消TaskCompletionSource,因此不需要在您的方法中这样做。

代码语言:javascript
复制
void Run()
{   
     var cts = new CancellationTokenSource();
     var myCompletionSource= new TaskCompletionSource();
     cts.Token.Register(() => myCompletionSource.SetCancelled());

     TriggerSomeLongLastingLogicWhichWillCallCallBackBelow(cts.Token);         
}

void SomeCallback(CancellationToken token)
{       
     // do some work
     ....

     token.ThrowIfCancellationRequested();

     if (someCondition)
     {
         myCompletionSource.SetResult(<someResult>);
     }
     else
     {
         myCompletionSource.SetException(new Exception("error occcured"));
     }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29788823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档