首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C#中安全调用异步方法而不等待

如何在C#中安全调用异步方法而不等待
EN

Stack Overflow用户
提问于 2013-03-20 11:59:06
回答 13查看 342.6K关注 0票数 460

我有一个不返回数据的async方法:

代码语言:javascript
运行
复制
public async Task MyAsyncMethod()
{
    // do some stuff async, don't return any data
}

我从另一个方法调用它,它返回一些数据:

代码语言:javascript
运行
复制
public string GetStringData()
{
    MyAsyncMethod(); // this generates a warning and swallows exceptions
    return "hello world";
}

在没有等待的情况下调用MyAsyncMethod()会导致visual中的"因为没有等待此调用,因此在调用完成之前,当前方法将继续运行。“警告。在该警告的页面上,它指出:

只有当您确信不希望等待异步调用完成,并且被调用的方法不会引发任何异常时,才应该考虑取消警告。

我确信我不想等待电话的完成,我不需要也没有时间去做。,但是调用可能会引起异常。

我偶然遇到过这个问题几次,我相信这是一个共同的问题,必须有一个共同的解决办法。

如何安全地调用异步方法而不等待结果?

更新:

对于那些建议我只是等待结果的人来说,这是响应web服务上的web请求的代码(ASP.NET Web )。在UI上下文中等待使UI线程保持空闲,但是等待在web请求调用中等待任务完成后才会响应请求,从而增加响应时间。

EN

Stack Overflow用户

发布于 2013-03-20 15:49:46

彼得·里奇( Peter )的回答是我想要的,而斯蒂芬·克利里的文章关于在ASP.NET早期返回的想法非常有帮助。

然而,作为一个更普遍的问题(不是特定于ASP.NET上下文),下面的控制台应用程序演示了使用Task.ContinueWith(...)的Peter的答案的用法和行为

代码语言:javascript
运行
复制
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中处理

票数 59
EN
查看全部 13 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15522900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档