gpt4 book ai didi

c# - 如果您知道任务已完成,可以在异步方法中调用 task.Result 吗?

转载 作者:太空狗 更新时间:2023-10-29 20:23:12 25 4
gpt4 key购买 nike

我知道在 async 方法中调用 task.Result 会导致死锁。不过,我对这个问题有不同的看法......

我发现自己经常使用这种模式。我有几个返回相同类型结果的任务,所以我可以同时等待它们。不过,我想单独处理结果:

Task<int> t1 = m1Async();
Task<int> t2 = m2Async();
await Task.WhenAll(t1, t2);

可以在这里调用 Result 吗,因为我知道任务现在已经完成了?

int result1 = t1.Result;
int result2 = t2.Result;

或者,我仍然应该使用 await 吗……它看起来是多余的,而且可能会更丑陋一些,具体取决于我需要如何处理结果:

int result1 = await t1;
int result2 = await t2;

更新:有人将我的问题标记为与此问题重复:Awaiting multiple Tasks with different results .问题是不同的,这就是为什么我没有在我的搜索中找到它,尽管那里的一个详细答案确实回答了问题。

最佳答案

在完成 await 之后使用 t1.Result 本身并没有错或不好,但您可能会面临 future 的问题。如果有人更改了您方法开头的代码,使您无法确定任务已成功完成怎么办?如果他们没有看到你的代码进一步向下做出这个假设怎么办?

在我看来,使用第一个 await 的返回值可能会更好。

Task<int> t1 = m1Async();
Task<int> t2 = m2Async();
var results = await Task.WhenAll(t1, t2);

int result1 = results[0];
int result2 = results[1];

这样,如果有人弄乱了第一个 await,他们就会自然而然地知道您的代码稍后取决于其结果。

您可能还想考虑 Task.WhenAll() 是否真的在这里给您任何值(value)。除非您希望区分一个任务失败与两个任务都失败之间的区别,否则单独等待任务可能很简单。

Task<int> t1 = m1Async();
Task<int> t2 = m2Async();

int result1 = await t1;
int result2 = await t2;

关于c# - 如果您知道任务已完成,可以在异步方法中调用 task.Result 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40186429/

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