我有一个异步方法 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更好。
答案 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);
} );