2017-03-29 16 views
1

如果它不返回任何东西,是否需要等待异步任务函数?这会导致下面的代码包装在委托中,并在异步任务函数返回后执行?如果我不在意它的返回值,我应该等待“异步任务”函数吗?

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

在上面的例子中,如果我在等待测试(DoSomethingAsync()),将导致下面的代码Console.WriteLine被包裹在委托和仅推迟执行时异步任务完成?

+0

我看不出理由。 – Trey

+1

如果你这样调用它,它将同步运行。 – dcg

+2

@dcg不,它不会。它会在它完成之前继续。 – Servy

回答

1

如果你不这样做,并且你的程序在任务完成之前退出,那么你就搞砸了。在允许退出之前,您至少要等待所有/任何这些任务。如果您不知道未等待的人何时完成,您还应该考虑同时运行的这些任务的多个实例的任何含义。例外情况也不能依赖于向呼叫者冒泡。

一个更好的办法可能是随时听候在顶层调用者只在最新的可能的时候,等待着,当你真的需要(例如,如果应用程序即将退出)

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

3

如果它不返回任何东西,是否需要等待异步任务函数?

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

等待任务是“射后不理”,字面意思是:

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

这是非常罕见的有一个真正的防火和忘记的情况。

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

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