我正在查看不久前编写的一些代码,这让我非常紧张。问题中方法的大致形状是这样的;
public Task Foo(...){
SyncMethod();
SyncMethod();
...
return AsyncMethod();
}
我意识到我可以只标记方法async
并在最后一次调用时执行await
,但是......我有 ?按原样使用安全吗?在最后一个 async
方法之前调用的同步方法没有异步替代方法,并且 Foo 方法不关心 AsyncMethod 的结果,因此看起来没问题只是将等待返回给调用者并让调用者处理它。
另外,FWIW,有问题的代码可能是从使用事件的 ASP.NET 上下文运行的线程中调用的,所以我的大脑中有一种刺痛的感觉,有一些我在这里没有看到的看不见的邪恶?
最佳答案
I realize I can just mark the method
async
and do anawait
on the last call, but...do I have to?
实际上,如果您这样做,唯一的变化是这些同步方法抛出的异常将被包装到返回的 Task
中。 ,而在当前的实现中,该方法将抛出异常,而不会成功返回 Task
。同步完成的工作和异步完成的工作的实际效果完全不受影响。
话虽如此,您提到的两个选项都令人担忧。这里有一个看似异步的方法,这意味着调用它的人希望它或多或少立即返回,但实际上该方法将同步运行一段时间。
如果您的两个同步方法非常快,因此,您确信任何调用者都不会注意到这一极少量的同步工作,那么没关系。然而,如果这项工作(甚至可能)需要花费大量时间才能解决,那么您就遇到了问题。
为这些方法提供实际的异步替代方案是最好的,但作为最后的手段,在您有更好的选择之前,通常您能做的最好的事情就是 await Task.Run(() => SyncMethod());
对于这些方法(这当然意味着该方法现在需要标记为 async
)。
关于c# - 不等待就返回异步方法的结果 - 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29436513/