c# - 如何在不等待的情况下安全地调用 C# 中的异步方法

标签 c# exception async-await task task-parallel-library

我有一个 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”警告。在该警告的页面上,它指出:

You should consider suppressing the warning only if you're sure that you don't want to wait for the asynchronous call to complete and that the called method won't raise any exceptions.

我确定我不想等待调用完成;我不需要也没有时间。 但调用可能引发异常。

这个问题我遇到过几次,我确信这是一个普遍存在的问题,必须有一个共同的解决方案。

如何在不等待结果的情况下安全地调用异步方法?

更新:

对于建议我只是等待结果的人来说,这是响应我们网络服务 (ASP.NET Web API) 上的网络请求的代码。在 UI 上下文中等待可保持 UI 线程空闲,但在 Web 请求调用中等待将等待 Task 在响应请求之前完成,从而无缘无故地增加响应时间。

最佳答案

如果你想“异步”获取异常,你可以这样做:

  MyAsyncMethod().
    ContinueWith(t => Console.WriteLine(t.Exception),
        TaskContinuationOptions.OnlyOnFaulted);

这将允许您在“主”线程之外​​的线程上处理异常。这意味着您不必“等待”从调用 MyAsyncMethod 的线程调用 MyAsyncMethod();但是,仍然允许您在出现异常时执行某些操作——但前提是出现异常。

更新:

从技术上讲,您可以使用 await 做类似的事情:

try
{
    await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
    Trace.WriteLine(ex);
}

...如果您需要专门使用try/catch(或using),这将很有用,但我找到了ContinueWith 更明确一点,因为你必须知道 ConfigureAwait(false) 是什么意味着。

关于c# - 如何在不等待的情况下安全地调用 C# 中的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15522900/

相关文章:

c# - SQL多重级联路径/无法先确定类型 Entity Framework 代码之间关联的主体端

c++ - 使用 vs typedef pointer-to-noexcept-function 不一致

访问失败的 COM 属性时,Powershell 返回 null 而不是异常

node.js - 如何阻止 async/await 在函数中冒泡?

c# - SendMailAsync 导致 TaskCanceledException 的原因?

c# - 将数组从 C++ 移动到 C#、修改它并将其传递回 C++ 的最简单方法

c# - 找不到命名空间名称 'SyntaxTree'

c# - 来自阵列的随机图像而不重复

Java JUnit - 是否可以确定是否抛出异常以及抛出哪个异常?

c# - 为什么 SaveChangesAsync 实际上没有保存我的所有更改?