如果我不关心它的返回值,我应该等待“异步任务”函数吗?

cod*_*ior 7 c# asynchronous

如果不返回任何内容,我是否需要等待异步任务函数?这是否会导致以下代码被包装在委托中并在异步任务函数返回后执行?

Task DoSomethingAsync()
{
    return Task.Run(() =>
    {
        // Do something, but doesn't return values.
    });
}

void Test()
{
    DoSomethingAsync();  // should I await?

    // Do other things, totally not related to the async function
    Console.WriteLine("aaa");
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,如果我在 Test() 中等待 DoSomethingAsync(),是否会导致以下代码 Console.WriteLine 被包装在委托中并仅在异步任务完成时延迟执行?

Ste*_*ary 5

如果不返回任何内容,我是否需要等待异步任务函数?

一般来说,是的。这不仅可以让您检测它何时完成,还可以让您响应任何错误。如果您愿意,您可以存储该Task对象,await然后再存储它。

等待任务是“即发即忘”,字面意思是:

  • 你不在乎它是否完成。
  • 你不在乎它什么时候完成。
  • 你不在乎它是成功还是失败。

真正的“即发即忘”场景是非常罕见的。

这是否会导致以下代码被包装在委托中并在异步任务函数返回后执行?

Task由异步函数完成返回,是的。


Jef*_*eff 2

如果你不这样做并且你的程序在任务完成之前退出,那么你就完蛋了。您至少希望在允许退出之前等待所有/任何这些任务。如果您不知道未等待的任务何时完成,您还应该考虑同时运行这些任务的多个实例的任何影响。也不能依赖异常向调用者冒泡。

更好的方法可能是始终在顶级调用者处等待,仅在您真正需要时等待(例如应用程序即将退出)

对于您关于 Console.WriteLine 的问题 - 是的,如果您等待上一行,它只会在完成后打印。如果您不等待,它将与任务中执行的代码竞争。