【发布时间】:2013-03-09 12:13:18
【问题描述】:
我有一个不返回数据的async 方法:
public async Task MyAsyncMethod()
{
// do some stuff async, don't return any data
}
我从另一个返回一些数据的方法调用它:
public string GetStringData()
{
MyAsyncMethod(); // this generates a warning and swallows exceptions
return "hello world";
}
调用 MyAsyncMethod() 而不等待它会在 Visual Studio 中导致“Because this call is not awaited, the current method continues to run before the call is completed”警告。在该警告的页面上,它指出:
只有在确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑取消警告。。 p>
我确定我不想等待通话完成;我不需要也没有时间。 但调用可能引发异常。
我偶然发现了这个问题几次,我确信这是一个常见的问题,必须有一个共同的解决方案。
如何在不等待结果的情况下安全地调用异步方法?
更新:
对于建议我等待结果的人来说,这是响应我们 Web 服务 (ASP.NET Web API) 上的 Web 请求的代码。在 UI 上下文中等待使 UI 线程保持空闲,但在 Web 请求调用中等待将等待任务完成后再响应请求,从而无缘无故地增加响应时间。
【问题讨论】:
-
如果您不想等待结果,唯一的选择是忽略/抑制警告。如果您确实想等待结果/异常,那么
MyAsyncMethod().Wait() -
关于您的编辑:这对我来说没有意义。假设响应在请求后 1 秒发送到客户端,2 秒后您的异步方法抛出异常。你会怎么处理这个例外?如果您的响应已发送,则无法将其发送给客户端。你还会用它做什么?
-
@Romoku 够公平的。无论如何,假设有人查看日志。 :)
-
ASP.NET Web API 方案的一个变体是一个长期存在的进程(例如,Windows 服务)中的 自托管 Web API,其中一个request 会创建一个冗长的后台任务来执行昂贵的操作,但仍希望使用 HTTP 202(已接受)快速获得响应。
-
为什么不使用
Task.Run()?
标签: c# exception async-await task task-parallel-library