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
相关产品推荐
相关产品推荐

