You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中方法参数内使用await的两段异步代码是否存在差异?

两段C#异步代码的差异分析

先看你给出的两段代码:

第一段代码:

MyFunction(await GetObject1(), await GetObject2());

第二段代码:

var obj1 = await GetObject1();var obj2 = await GetObject2();MyFunction(obj1 , obj2);

这两段代码完全没有差异,C#不会对这种场景做“同时启动两个参数计算再依次等待”的优化,原因很明确:

  • C#的参数求值严格遵循从左到右的顺序。第一段代码中,会先执行GetObject1()拿到它返回的Task,接着await这个Task直到完成,拿到结果后才会执行GetObject2(),再await它的Task完成,最后把两个结果传入MyFunction。
  • 第二段代码只是把两次await的结果提前赋值给变量,执行逻辑和第一段完全一致,都是串行等待两个异步操作完成。

如果想要让GetObject1()和GetObject2()并行执行,需要先启动两个异步任务(不立即await),再等待它们完成,比如两种常见写法:

写法一:

var task1 = GetObject1();
var task2 = GetObject2();
MyFunction(await task1, await task2);

写法二:

var results = await Task.WhenAll(GetObject1(), GetObject2());
MyFunction(results[0], results[1]);
// 或者用解构赋值(C# 7.0+)
var (obj1, obj2) = await Task.WhenAll(GetObject1(), GetObject2());
MyFunction(obj1, obj2);

内容的提问来源于stack exchange,提问作者Ivan Braiko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:45:34