【发布时间】:2021-11-23 18:02:01
【问题描述】:
有没有更好的方法来编写这个异步代码(例如,这样我就不需要重复 if (myCondition) 两次)?我想避免在这里使用Task.Run。
var tasks = new List<Task>();
Task<String> t1 = null;
Task<String> t2 = null;
if (myCondition) {
t1 = getAsync();
tasks.Add(t1);
}
if (myOtherCondition) {
t2 = getAsync2();
tasks.Add(t2);
}
await Task.WhenAll(tasks)
if (myCondition) {
result.foo = await t1;
}
if (myOtherCondition) {
result.bar = await t2;
}
【问题讨论】:
-
如果 t1 和 t2 之间没有相互依赖关系,我不知道你为什么要这样做。
-
嗨!这个想法是等待与
Task.WhenAll()并行的任务 -
用
if (t1 != null) {}等替换第二组检查 -
你也不需要等待 Task.WhenAll 所以它基本上什么都不做(不是无论如何都需要它)。
-
@jmn 好吧,我想你可以有一个
List<(Task<string>, Action<string, result>)>,在那里存储(getAsync(), (s, r) => {r.foo = s;})之类的东西,然后你可以摆脱你的t1和t2并处理执行 lambda 的列表将元组任务的结果传递给它,但它是否是一种改进可能是有争议的。您不需要WhenAll,只需await任务按它们在列表中的顺序排列,它们仍将同时运行 - 但您当前的代码也是如此,如上面 cmets 中所述,所以不需要在这里改进。
标签: c# .net async-await