我的问题是:当没有等待时,异步真的在做什么?
在可观察的行为方面:
警告说,代码仍然会同步运行
结果(包括抛出的任何异常)将被包含在一个 Task
在实现方面,编译器将生成一个状态机来处理所有的异步.但这不应该改变任何其他行为.
我不能立即想到你会看到这种消息行为的任何原因,除非由于处理异常而产生差异.如果调用代码正在捕获异常但忽略了错误的任务(反之亦然),这肯定可以解释差异.我的第一个诊断步骤是添加一些日志记录,以查看方法是否成功完成或是否在某处抛出异常.
现在你说你回来null
,这是从来电者的角度来看,一定的差异:有返回的方法之间的巨大差异null
的价值Task
,并且方法返回一个Task
与null
它的价值Result
属性.也许调用者正在取消引用返回的值,并且NullReferenceException
正在抛出一个?
如果是这种情况,你的第一个调用端口应该是找出你以前无法看到该异常的原因 - 它表明缺少一些日志记录.然后你可以通过更改它来修复它:
return null;
至
return Task.FromResult(null);