作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个异步方法 Task<int> DoInt()
和Task<string> DoString(int value)
。我有第三种异步方法 Task<string> DoBoth(int value)
其目标是异步执行 DoInt()
,将其输出通过管道传输到 DoString(int)
并使结果成为 DoBoth()
的结果.
重要的限制是:
DoInt()
的源代码或DoString()
,所以我不能修改它们。DoBoth()
的结果关键是我已经有了异步方法(即返回任务),并且我想通过管道将数据从一个任务传输到另一个任务,而不一路阻塞,在初始任务中返回最终结果。除了不阻止以下代码之外,我可以执行以下所有操作:
代码示例:
// Two asynchronous methods from another library, i.e. can't be changed
Task<int> DoInt();
Task<string> DoString(int value);
Task<string> DoBoth()
{
return DoInt().ContinueWith<string>(intTask =>
{
// Don't want to block here on DoString().Result
return DoString(intTask.Result).Result;
});
}
自 Task<string> DoString(int)
已经是一个异步方法,如何干净地创建它的非阻塞延续?实际上,我想从现有任务而不是从 Func 创建延续。
最佳答案
您可以使用 TaskExtensions.Unwrap 编写整个链如:
Task<string> DoBoth(int value)
{
Task<Task<string>> task = DoInt(value).ContinueWith(valueTask =>
{
return DoString(valueTask.Result);
});
return task.Unwrap();
}
请注意,这假设 DoInt
定义为Task<int> DoInt(int value);
,这与您的描述不同,但遵循您的代码示例。
如果 DoInt 不采用 int 参数(与您的声明匹配),则可能会变成:
Task<string> DoBoth()
{
return DoInt().ContinueWith(t => DoString(t.Result)).Unwrap();
}
<小时/>
作为额外的 - 使用 C# 5 和 .NET 4.5(或异步目标包),您可以将其编写为:
async Task<string> DoBoth(int value)
{
int first = await DoInt(value);
return await DoString(first);
}
关于.net - 继续任务<T>到任务<YOU>而不阻塞结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955906/
我是一名优秀的程序员,十分优秀!