-2

我有一个异步方法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 更好。

4

2 回答 2

1

案例 1 将启动a并在之后立即Task执行其余部分。Dosomething()

情况 2 将启动 aTask并等待它完成,然后再执行Dosomething().

因此,如果您想在SaveINSQLDB没有阻塞的情况下调用并等待它完成,您应该使用第一个选项。您可能希望捕获异常并在您传递给的操作中进行一些日志记录Task.Run

于 2019-09-18T12:52:19.283 回答
0

如果是我,我会选择案例 1。很明显,在这种情况下是“一劳永逸”。

在情况 2 中,await 关键字的存在可能会使阅读它的人认为如果他们将 await 误读为不在即发即弃过程中的顶级调用,它将等待响应。

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

编辑:抱歉,我错过了案例 2 中的第一个等待。正如 ​​Selvin 在对我的回答案例 2 的评论中指出的那样,它不会触发并忘记,因为它正在等待回复。如果您想要“即发即弃”,则案例 1 是可行的方法。

MS docs中的示例类似于 case1:

var t = Task.Run(() => {  Console.WriteLine("Task thread ID: {0}",
                                   Thread.CurrentThread.ManagedThreadId);
                             } );
于 2019-09-18T11:43:02.780 回答