gpt4 book ai didi

c# - 一劳永逸,使用 `Task.Run` 或只调用一个没有 `await` 的异步方法

转载 作者:行者123 更新时间:2023-12-03 21:15:48 24 4
gpt4 key购买 nike

注意:这是一个超出 Asp.Net 领域的问题和网络应用程序。

一般来说,尤其是在库或控制台应用程序方面,为了触发并忘记异步方法,最好只调用异步方法而不用 await使用它或使用 Task.Run ?

基本上:

public static void Main(){
// Doing
_ = DoSomethingAsync();

// vs.
_ = Task.Run(DoSomethingAsync);
}

private static async Task DoSomethingAsync()
{
...
}

最佳答案

In general especially when it comes to libraries or console apps, in order to fire and forget an async method, is it better to just call the async method without awaiting it or use Task.Run?



一般来说,最好不要使用即发即忘。

“火而忘记”的意思是:
  • 你不在乎代码是否有异常。任何异常都会导致它静默失败;没有日志记录,没有通知等
  • 您不需要知道代码何时完成。即,消费应用程序永远不需要等待代码完成。即使在关机期间。
  • 您不需要代码即可完成。作为 (2) 的推论,即发即弃的代码可能无法运行完成;并且作为 (1) 的推论,您不会收到它未能完成的通知。

  • 简而言之,“即发即忘”只适用于极少数的任务。例如,更新缓存。我想说可能有 85% 或更多的“即发即忘”代码是错误的——它使用了“即发即忘”的代码来处理不应该是即发即忘的代码。

    所以我想说最好的解决方案是不使用火而完全忘记。至少,你应该暴露一个 Task某处代表“后续行动”。考虑添加 Task到您的返回类型或将其作为属性公开。

    采用即发即弃——尤其是在图书馆中——意味着你迫使所有消费者永远不知道何时关闭和退出是安全的。但是,如果您真的想开火而忘,则有几种选择。

    A. 一种选择是调用 async void功能 without a context .消费应用程序仍然无法确定代码是否/何时完成,但至少不会忽略异常。

    B. 另一种选择是在没有上下文的情况下开始任务。此选项具有触发和忘记代码的缺点:忽略异常并且调用代码无法知道它何时完成。

    这两个建议都是在没有上下文的情况下开始任务的。有 helpers for doing this ,或者您可以将调用包裹在 Task.Run 中(效率稍低,但效果很好)。

    我不建议直接启动任务。虽然这在控制台应用程序中可以正常工作,但它不适用于在提供上下文的情况下可能调用的库。

    关于c# - 一劳永逸,使用 `Task.Run` 或只调用一个没有 `await` 的异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60778423/

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