c# - 不等待就返回异步方法的结果 - 坏主意?

标签 c# asynchronous async-await

我正在查看不久前编写的一些代码,这让我非常紧张。问题中方法的大致形状是这样的;

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 an await on the last call, but...do I have to?

实际上,如果您这样做,唯一的变化是这些同步方法抛出的异常将被包装到返回的 Task 中。 ,而在当前的实现中,该方法将抛出异常,而不会成功返回 Task 。同步完成的工作和异步完成的工作的实际效果完全不受影响

话虽如此,您提到的两个选项都令人担忧。这里有一个看似异步的方法,这意味着调用它的人希望它或多或少立即返回,但实际上该方法将同步运行一段时间。

如果您的两个同步方法非常快,因此,您确信任何调用者都不会注意到这一极少量的同步工作,那么没关系。然而,如果这项工作(甚至可能)需要花费大量时间才能解决,那么您就遇到了问题。

为这些方法提供实际的异步替代方案是最好的,但作为最后的手段,在您有更好的选择之前,通常您能做的最好的事情就是 await Task.Run(() => SyncMethod());对于这些方法(这当然意味着该方法现在需要标记为 async )。

关于c# - 不等待就返回异步方法的结果 - 坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29436513/

相关文章:

具有完整名称的 C# Enum.ToString()

javascript - 这可能是关于什么的? [TsLint 错误 : "Promises must be handled appropriately"]

递归可观察调用中的Angular 4加载树结构

c# - 将 DataTable 绑定(bind)到 DataGrid C# WPF MVVM

c# - 混淆哈希表的浅拷贝

c# - 想要在文本 block 中显示 slider 的值?

c++ - 亚信 : Prevent asynchronous client from being deleted?

javascript - for inside 的两个 promise

c# - 带有异步 Task.Run 方法的死锁,带有来自 Synchronus 方法的 Wait 和超时

javascript - 等待正常功能