C# FireAndForget任务的实现

C# FireAndForget任务的实现,c#,async-await,fire-and-forget,C#,Async Await,Fire And Forget,我有一个异步方法DoSomething(),在DoSomething()中,我调用另一个方法“SaveINSQLDB()”,如下所示 private static async Task Dosomething() { my few lines of code.... SaveINSQLDB()... // I don't want wait for its response to execute further // (fire and

我有一个异步方法DoSomething(),在DoSomething()中,我调用另一个方法“SaveINSQLDB()”,如下所示

private static async Task Dosomething()
{
    my few lines of code....

    SaveINSQLDB()... // I don't want wait for its response to execute further
                     // (fire and forget case).
    my few lines of code
}
我可以使用以下任何一种方法,请向我推荐最佳方法(请说明原因?)

案例1

Task.Run(() => SaveINSQLDB(arg1, arg2)); 
我可以使SaveINSQLDB()成为一个简单的静态方法

案例2

await Task.Run(async () =>
                          {
                             await SaveINSQLDB(arg1, arg2);
                          }); 
我可以使SaveINSQLDB()成为一个静态异步方法

在我看来,案例1更好。

如果是我,我会选择案例1。很明显,在这种情况下,这是“开火并忘记”

在案例2中,如果有人将wait误读为不在fire-and-forget流程中的顶级调用,那么wait关键字的存在可能会使阅读它的人认为它将等待响应

你不会对等待的回复做任何事情,所以没有必要等待它

编辑:很抱歉,我错过了案例2中的第一次等待。正如塞尔文在对我的回答的评论中指出的那样,案例2并不是在等待答复时开火并忘记。案例1是一种方法,如果你想要火和忘记

示例是否类似于案例1:

var t = Task.Run(() => {  Console.WriteLine("Task thread ID: {0}",
                                   Thread.CurrentThread.ManagedThreadId);
                             } );
案例1将启动一个
任务
,然后立即执行
Dosomething()
的其余部分

案例2将启动一个
任务
并等待其完成,然后再执行
Dosomething()
的其余部分


因此,如果您想调用
SaveINSQLDB
,而不阻塞并等待它完成,那么应该使用第一个选项。您可能希望捕获异常,并在传递给
任务的操作中进行一些日志记录。不过请运行

你为什么认为案例1更好?它们可能都以相同的方式编译成IL<代码>等待任务.Run(异步()=>{await SaveINSQLDB(arg1,arg2);})hmmm案例2正在等待结果,因此它不是火灾和火灾forget@Selvin案例1甚至不会开火。您仍然需要运行
task.Wait()
或其他操作。否则,它只是包装到TaskCase中。如果一个是正确的解决方案,则触发一个新任务,但不要等待它完成result@Olegl案例1甚至不会开火。您仍然需要运行task.Wait()或其他操作。否则,它只是包装到任务中。。。似乎你读了太多“任务不是线程”。。。在
Task.Run
的情况下,我们可以说Task与Task一样是线程。Run-将指定的工作排队以在线程池上运行案例2,如果出现wait关键字,阅读它的人会认为它将等待响应,如果他们将wait误读为fire and forget进程之外的顶级调用。什么?有两个等待<代码>等待任务。Run(async()=>await…
意味着它没有开火,因为它在
async Task Dosomething()中。
是的,你是对的,我完全错过了案例2中的第一次等待