FireAndForget通过Task实现

时间:2019-09-18 10:56:06

标签: 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 forget case).
    my few lines of code
}

我可以使用以下任何一种方法,请向我建议最佳方法(并说明原因?)。

案例1

Task.Run(() => SaveINSQLDB(arg1, arg2)); 

我可以将 SaveINSQLDB()设为简单的静态方法。

情况2。

await Task.Run(async () =>
                          {
                             await SaveINSQLDB(arg1, arg2);
                          }); 

我可以将 SaveINSQLDB()设为静态异步方法。

我认为Case1更好。

2 个答案:

答案 0 :(得分:1)

案例1将开始一个Task,然后立即执行Dosomething()的其余部分。

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

因此,如果您要呼叫SaveINSQLDB而不阻塞并等待其完成,则应该使用第一个选项。不过,您可能想捕获异常并登录到传递给Task.Run的操作中。

答案 1 :(得分:0)

如果是我,我会处理案例1。显然,在这种情况下,这是“生与死”。

在第2种情况下,如果await关键字的存在使某人阅读它,而误认为该等待是针对即发即弃过程中的顶级调用的,则可能会认为正在等待该响应。

您不会对等待的答复做任何事情,因此无需等待。

编辑:抱歉,我错过了案例2的第一次等待。正如Selvin在对我的答案的评论中指出的那样,案例2并不是开枪而忘记,因为它在等待答复。如果您要抛弃,情况1就是要走的路。

MS docs中的示例类似于case1:

var t = Task.Run(() => {  Console.WriteLine("Task thread ID: {0}",
                                   Thread.CurrentThread.ManagedThreadId);
                             } );