依赖完成后如何继续下一个任务?会有Task.ContinueWith()
帮助吗?如果不是,我怎样才能有效地处理以下情况而不将功能整合到一个功能中?假设有 4 个异步函数:
async Task<string> Func1(string a){}
async Task<string> Func2(string returnedStringFromFunc1 ){}
async Task<string> Func3(string b){}
async Task<string> Func4(string returnedStringFromFunc3){}
Task tsk1 = func1("abc");
Task tsk3 = func3("efg");
await tsk1; // In case tsk3 is completed early, flow is waiting here.
// Instead I could have started tsk4.
Task tsk2 = func2(tsk1.Result);
await tsk3;
Task tsk4 = func4(tsk3.Result);
尝试使用这些非常有用的扩展方法:
public static class TaskEx
{
public static async Task<R> Select<T, R>(this Task<T> task, Func<T, R> s)
{
var t = await task;
return s(t);
}
public static async Task<R> SelectMany<T, R>(this Task<T> task, Func<T, Task<R>> k) => await k(await task);
public static async Task<R> SelectMany<T, U, R>(this Task<T> task, Func<T, Task<U>> k, Func<T, U, R> s)
{
var t = await task;
var u = await k(t);
return s(t, u);
}
}
然后你可以这样做:
async Task Main()
{
Task<string> q1 =
from x in Func1("abc")
from y in Func2(x)
select y;
Task<string> q2 =
from x in Func3("efg")
from y in Func4(x)
select y;
string r1 = await q1;
string r2 = await q2;
Console.WriteLine(r1);
Console.WriteLine(r2);
}
Task<string> Func1(string a) => Task.FromResult(a);
Task<string> Func2(string c) => Task.FromResult($"{c}!");
Task<string> Func3(string b) => Task.FromResult(b);
Task<string> Func4(string d) => Task.FromResult($"{d}!");
我得到以下信息:
abc!
efg!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句