【发布时间】:2019-09-18 10:56:06
【问题描述】:
我有一个异步方法 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
}
我可以使用以下任何一种方法,请向我推荐最佳的方法(并请说明原因?)。
案例一。
Task.Run(() => SaveINSQLDB(arg1, arg2));
我可以使 SaveINSQLDB() 成为一个简单的静态方法。
案例2。
await Task.Run(async () =>
{
await SaveINSQLDB(arg1, arg2);
});
我可以将 SaveINSQLDB() 设为静态异步方法。
在我看来,Case1 更好。
【问题讨论】:
-
为什么你认为
Case1更好?它们可能都以相同的方式编译到 IL。 -
案例 2.
await Task.Run(async () => { await SaveINSQLDB(arg1, arg2); });嗯,案例 2 正在等待结果,所以它不会被忽略 -
@Selvin case 1 甚至不会触发。你仍然需要运行
task.Wait()或其他东西。否则,它只是包装到 Task -
案例一是正确的解决方案,触发一个新任务但不要等待它的结果
-
@Olegl case 1 甚至不会触发。您仍然需要运行 task.Wait() 或其他东西。否则,它只是包装到任务中 are you sure? ...似乎您读了太多“任务不是线程”...在
Task.Run的情况下,我们可以说任务是一种线程Task.Run - 将指定的工作排入队列以在 ThreadPool 上运行
标签: c# async-await fire-and-forget