gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 03:28:34 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com