Nito.AsyncEx.AsyncContext.Run正确用法及lambda调用写法疑问
Nito.AsyncEx的AsyncContext.Run两种lambda写法对比
两种写法在功能上都是正确的,最终得到的执行结果、异常传递行为完全一致,核心差异仅在于开销和适用场景:
- 第一种写法
var blah = AsyncContext.Run(() => MyMethodAsync(myvar));
这种写法的lambda直接返回MyMethodAsync生成的Task实例,没有额外生成async/await状态机,性能开销更小,写法也更简洁,和官方示例中直接传入方法组的逻辑完全等价,适合lambda内仅需要调用单个异步方法、没有其他额外逻辑的场景。 - 第二种写法
var blah = AsyncContext.Run( async () => await MyMethodAsync(myvar));
这种写法多了一层async/await的状态机包装,会产生可以忽略的微小性能开销,但是如果你的lambda内除了调用MyMethodAsync之外还有其他逻辑(比如调用多个异步方法、执行同步预处理、捕获特定异常处理等),就必须使用这种带async/await的写法。
最佳实践建议
如果lambda逻辑只是单纯转发异步方法调用,优先用第一种写法;涉及多步异步操作时再用第二种写法即可。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

