c# - "fire and forget"异步任务或在后台运行它的正确方法

标签 c# .net asynchronous

我需要运行一些异步任务,这导致我永远不会在任何地方使用它,而且我不在乎它何时完成。

例如,我可能需要我的 Discord 客户端响应如下命令:

// .command
await StartLongAsyncTaskThatMayTakeForeverToCompleteAndSay("I'm late");
await Context.Message.ReplyAsync("Immediately say hi"));
// => "Immediately say hi"
// *few seconds later*
// => "I'm late"

我应该这样做:await StartLongAsyncTask().ConfigureAwait(false);_ = StartLongAsyncTask(); 或者我应该使用 Task.Run (() => {} );,有什么区别?

最佳答案

这在很大程度上取决于 StartLongAsyncTaskThatMayTakeForeverToCompleteAndSay 是什么以及上下文,例如在某些情况下将调用结果分配给任务变量并在第二次调用后等待它是可以的:

var task = StartLongAsyncTaskThatMayTakeForeverToCompleteAndSay("I'm late");
await Context.Message.ReplyAsync("Immediately say hi"));
await task;

或者只是:

await Task.WhenAll(StartLongAsyncTaskThatMayTakeForeverToCompleteAndSay("I'm late"), 
    Context.Message.ReplyAsync("Immediately say hi")));

有关两者之间的差异 - 请参阅 Why should I prefer single 'await Task.WhenAll' over multiple awaits? .

关于c# - "fire and forget"异步任务或在后台运行它的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75112294/

相关文章:

c# - 错误 CS1061 : 'DbSet<T>' does not contain a definition for 'FromSql' and no extension method 'FromSql' accepting a first argument of type 'DbSet<T>'

c# - 多点触摸屏和 WPF 列表框

jquery - 同时执行同步和异步 AJAX

node.js - Pg-promise:返回查询结果的正确方法

c# - 如何在 Orchard CMS 中的创建事件期间访问部件属性

c# - 读取 Ctrl + 直到从键盘中找到非数字

c# - 从多线程单元访问带有线程模型单元的 COM dll 时出错

.net - 如何在 WPF MVVM 中使用用户控件

c# - 使用 F5 时,终于似乎没有在 C# 控制台应用程序中执行

javascript - 使用 JavaScript 和 jQuery 的简单长轮询示例