有没有更好的方式来编写这个异步代码(比如,我不需要重复两次
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;
}
Task.WhenAll()
并行等待任务。 - jmnList<(Task<string>, Action<string, result>)>
,像(getAsync(),(s,r) => {r.foo = s;})
这样的东西存储在其中,然后你就可以摆脱你的t1
和t2
,只需处理执行lambda传递Tupled任务结果即可。但这可能是值得商榷的改进。您不需要WhenAll
,只需按列表中的顺序等待任务,它们仍将同时进行 - 但这也适用于您当前的代码,如上面的评论所述,因此没有改进。 - GSergWhenAll
,如果您正确处理这些异常以便无论如何都能到达WhenAll
,那么同样的处理将允许您到达等待每个任务的步骤。 - GSerg