【发布时间】:2018-09-03 16:29:51
【问题描述】:
我用How to: Extend the async Walkthrough by Using Task.WhenAll (C#)开发了一个程序,可以独立异步提交多个数据库查询。该程序工作正常,但有一个细微差别我不明白,我找不到解释:
在示例中,方法SumPageSizesAsync 的签名是:
private async Task SumPageSizesAsync()
方法SumPageSizesAsync 的主体没有显式返回whenAllTask 对象(即WhenAll 汇总Task)。为什么SumPageSizesAsync 方法没有显式返回whenAllTask 任务? StartButton_Click 中调用SumPageSizesAsync 的代码行如何“知道”返回的是哪个任务?
private async void StartButton_Click(object sender, RoutedEventArgs e)
{
.
Task sumTask = SumPageSizesAsync();
.
}
private async Task SumPageSizesAsync()
{
HttpClient client = new HttpClient() { MaxResponseContentBufferSize = 1000000 };
List<string> urlList = SetUpURLList();
IEnumerable<Task<int>> downloadTasksQuery = from url in urlList select ProcessURLAsync(url);
Task<int>[] downloadTasks = downloadTasksQuery.ToArray();
Task<int[]> whenAllTask = Task.WhenAll(downloadTasks);
int[] lengths = await whenAllTask;
int total = lengths.Sum();
// Display the total count for all of the web addresses.
resultsTextBox.Text += string.Format("\r\n\r\nTotal bytes returned: {0}\r\n", total);
// where's the return statement?
}
【问题讨论】:
-
标记为异步的方法包装在 Task 对象中,无论您从它返回的是什么。这个问题的公认答案很好地解释了它:stackoverflow.com/questions/25191512/async-await-return-task
-
谢谢,我并不是要争论,但这并不能完全回答我的问题。我了解
wrapped in a Task部分,但是编译器如何知道whenAllTask任务是在没有显式编码分配的情况下要返回的任务?如果SumPageSizesAsync方法有两个或更多Task.WhenAll语句怎么办? (假设这是可能的)。 -
您误解了它的工作原理。
whenAllTask任务不是要返回的任务。方法的其余部分被编译器转换成一个Task,也就是要返回的Task。 -
@Dennis_E:“方法的其余部分作为任务返回”:哦,伙计,是的,当然。请将此作为答案发布。
标签: c# async-await task