如果我不关心它的返回值,我应该等待'异步任务'功能吗?

时间:2017-03-29 19:44:02

标签: 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");
}

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

2 个答案:

答案 0 :(得分:3)

  

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

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

等待任务的

是“一劳永逸”,字面意思是:

  • 你不在乎它是否完成。
  • 完成后你不在乎。
  • 你不关心它是成功还是失败。

实现真正的“即发即弃”场景非常罕见。

  

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

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

答案 1 :(得分:1)

如果你没有,并且你的程序在任务完成之前退出,那你就搞砸了。在允许退出之前,您至少希望等待所有/任何这些任务。如果您不知道未完成的任务何时结束,您还应该考虑同时运行的这些任务的多个实例的任何影响。也不能依赖例外来冒泡到呼叫者。

更好的方法可能是始终等待最高级别的来电者只在最后可能的时刻等待您真正需要(如果应用即将退出)

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