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

标签 c# async-await

我知道在 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/

相关文章:

c# - 如何回答请求但继续处理 WebApi 中的代码

c# - 如何从 C# 中的 Azure HTTP 触发器函数删除 CosmosDB 中的项目

c# - 当只允许该程序的一个实例时从系统托盘恢复窗口

c# - 有什么方法可以从 IDE 中截取数百行代码的屏幕截图?特别是 Java 和 C# 着色

c# - 替换一个子字符串的值,但一个

async-await - 无服务器授权器异步等待不起作用

c# - 单一方法中的多个等待

C# Mongo FirstOrDefaultAsync 挂起

c# - 将 get;set 字符串 DateEntered 从 yyyy-MM-dd 转换为 C# 中的 MM-dd-yyyy?

windows - 如何在 Windows UAP 应用程序中解决 "' IAsyncActionWithProgress< >' is defined in an assembly that is not referenced"