gpt4 book ai didi

.net - 继续任务到任务而不阻塞结果

转载 作者:行者123 更新时间:2023-12-03 04:27:58 24 4
gpt4 key购买 nike

我有两个异步方法 Task<int> DoInt()Task<string> DoString(int value) 。我有第三种异步方法 Task<string> DoBoth(int value)其目标是异步执行 DoInt() ,将其输出通过管道传输到 DoString(int)并使结果成为 DoBoth() 的结果.

重要的限制是:

  1. 我可能没有 DoInt() 的源代码或DoString() ,所以我不能修改它们。
  2. 我不想在任何时候阻止
  3. 一个任务的输出(结果)必须作为下一个任务的输入传递
  4. 最终的输出(结果)就是我想要的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com