在asynchronous方法结束时,我应该返回还是等待?

在任务返回asynchronous方法结束时,如果我调用另一个asynchronous方法,我可以await它或return它的任务。 每个人的后果是什么?

  Task FooAsync() { return BazAsync(); // Option A } async Task BarAsync() { await BazAsync(); // Option B } 

如果方法本身被声明为async则不能返回任务 – 所以这不起作用,例如:

 async Task BarAsync() { return BazAsync(); // Invalid! } 

这将需要返回types的Task<Task>

如果你的方法只是做less量的工作,然后调用一个asynchronous方法,那么你的第一个选项是好的,意味着有一个较less的任务。 你应该知道,在你的同步方法中引发的任何exception将被同步传递 – 事实上,这是我更喜欢处理参数validation。

这也是通过取消令牌实现重载的常见模式。

请注意,如果您需要更改以等待其他事情,则需要改为asynchronous方法。 例如:

 // Version 1: Task BarAsync() { // No need to gronkle yet... return BazAsync(); } // Oops, for version 2 I need to do some more work... async Task BarAsync() { int gronkle = await GronkleAsync(); // Do something with gronkle // Now we have to await BazAsync as we're now in an async method await BazAsync(); } 

查看此链接描述的位置: http : //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

 async Task<int> TaskOfTResult_MethodAsync() { int hours; // . . . // The body of the method should contain one or more await expressions. // Return statement specifies an integer result. return hours; } // Calls to TaskOfTResult_MethodAsync from another async method. private async void CallTaskTButton_Click(object sender, RoutedEventArgs e) { Task<int> returnedTaskTResult = TaskOfTResult_MethodAsync(); int intResult = await returnedTaskTResult; // or, in a single statement //int intResult = await TaskOfTResult_MethodAsync(); } // Signature specifies Task async Task Task_MethodAsync() { // . . . // The body of the method should contain one or more await expressions. // The method has no return statement. } // Calls to Task_MethodAsync from another async method. private async void CallTaskButton_Click(object sender, RoutedEventArgs e) { Task returnedTask = Task_MethodAsync(); await returnedTask; // or, in a single statement //await Task_MethodAsync(); }