我有一个不返回数据的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中的"因为没有等待此调用,因此在调用完成之前,当前方法将继续运行。“警告。在该警告的页面上,它指出:
只有当您确信不希望等待异步调用完成,并且被调用的方法不会引发任何异常时,才应该考虑取消警告。
我确信我不想等待电话的完成,我不需要也没有时间去做。,但是调用可能会引起异常。
我偶然遇到过这个问题几次,我相信这是一个共同的问题,必须有一个共同的解决办法。
如何安全地调用异步方法而不等待结果?
更新:
对于那些建议我只是等待结果的人来说,这是响应web服务上的web请求的代码(ASP.NET Web )。在UI上下文中等待使UI线程保持空闲,但是等待在web请求调用中等待任务完成后才会响应请求,从而增加响应时间。
发布于 2013-03-20 15:49:46
彼得·里奇( Peter )的回答是我想要的,而斯蒂芬·克利里的文章关于在ASP.NET早期返回的想法非常有帮助。
然而,作为一个更普遍的问题(不是特定于ASP.NET上下文),下面的控制台应用程序演示了使用Task.ContinueWith(...)
的Peter的答案的用法和行为
static void Main(string[] args)
{
try
{
// output "hello world" as method returns early
Console.WriteLine(GetStringData());
}
catch
{
// Exception is NOT caught here
}
Console.ReadLine();
}
public static string GetStringData()
{
MyAsyncMethod().ContinueWith(OnMyAsyncMethodFailed, TaskContinuationOptions.OnlyOnFaulted);
return "hello world";
}
public static async Task MyAsyncMethod()
{
await Task.Run(() => { throw new Exception("thrown on background thread"); });
}
public static void OnMyAsyncMethodFailed(Task task)
{
Exception ex = task.Exception;
// Deal with exceptions here however you want
}
GetStringData()
在没有等待MyAsyncMethod()
的情况下提前返回,在MyAsyncMethod()
中抛出的异常将在OnMyAsyncMethodFailed(Task task)
和中处理,而不是在GetStringData()
/catch
中处理。
https://stackoverflow.com/questions/15522900
复制相似问题