c# - 没有 TaskCompletionSource 的任务链?

标签 c# task-parallel-library async-ctp

我正在将一些异步/等待代码转换为链式任务,因此我可以在已发布的框架中使用它。等待代码如下所示

public async Task<TraumMessage> Get() {
  var message = await Invoke("GET");
  var memorized = await message.Memorize();
  return memorized;
}

在哪里

Task<TraumMessage> Invoke(string verb) {}
Task<TraumMessage> Memorize() {}

我希望链InvokeMemorize返回 Memorize 产生的任务,但这会导致 Task<Task<TraumMessage> .我最终得到的解决方案是 TaskCompletionSource<TraumMessage>作为我的信号:

public Task<TraumMessage> Get() {
  var completion = new TaskCompletionSource<TraumMessage>();
  Invoke("GET").ContinueWith( t1 => {
     if(t1.IsFaulted) {
       completion.SetException(t1.Exception);
       return;
     }
     t1.Result.Memorize().ContinueWith( t2 => {
       if(t2.IsFaulted) {
         completion.SetException(t2.Exception);
         return;
       }
       completion.SetResult(t2.Result);
     });
  });
  return completion.Task;
}

有没有办法在没有 TaskCompletionSource 的情况下完成此操作? ?

最佳答案

是的,该框架带有一个方便的 Unwrap() 扩展方法,正是您想要的。

Invoke("GET").ContinueWith( t => t.Result.Memorize() ).Unwrap();

如果您要取消,那么显然您需要将取消 token 传递到适当的位置。

关于c# - 没有 TaskCompletionSource 的任务链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6884470/

相关文章:

c# - 奇怪的数字错误

c# - SynchronizationContext.CreateCopy 的目的

c# - Asp.Net 中 Task.Run 和 QueueBackgroundWorkItem 的区别

c# - 如何从 getter 或 setter 调用异步方法?

c# - 为什么从 Async CTP/Release 中删除 "SwitchTo"?

c# - OrderBy 数字和 ThenBy bool 值不适用于 List

c# - 尝试使用 Google API 将授权代码交换为访问代码时出错

asp.net-mvc - Azure Web 角色压力测试 - AsyncController 中的 1000 毫秒阻塞操作

.net - 使用异步 CTP 封装同步方法不起作用

c# - 是否选中了两个或三个单选按钮中的任何一个