我正在学习 C# 的等待异步功能。但是波纹管代码的行为让我感到困惑。
public static async Task CreateMultipleTasksAsync() {
HttpClient client = new HttpClient() {
MaxResponseContentBufferSize = 1000000
};
Task <int> download1 = ProcessUrlAsync("https://msdn.microsoft.com", client);
Task <int> download2 = ProcessUrlAsync("https://msdn.microsoft.com/library/67w7t67f.aspx", client);
int length1 = await download1;
int length2 = await download2;
Console.WriteLine("Sum is {0}", length1 + length2);
}
public static async Task <int> ProcessUrlAsync(string url, HttpClient client) {
Console.WriteLine("I am here to process {0}", url);
var byteArray = await client.GetByteArrayAsync(url);
Console.WriteLine("processing is completed {0}", url);
return byteArray.Length;
}
我期望的是在完成下载 1 和下载 2 后,CreateMultipleAsync() 的最后一行将执行并打印长度总和。 问题是最后一行永远不会执行!
最佳答案
我认为问题在于您执行 CreateMultipleTasksAsync()
方法的方式。
如果你像这样从同步方法中执行它
static void Main(string[] args)
{
CreateMultipleTasksAsync();
}
那么你就看不到最后一行的结果了。
为什么?由于未等待此调用,因此 Main
方法将继续,并在调用 CreateMultipleTasksAsync()
完成之前结束。所以你看不到最后一行的结果。
让我们这样执行,你会得到它
static void Main(string[] args)
{
var task = CreateMultipleTasksAsync();
task.Wait();
}
祝你好运。
关于c# - 无法理解异步的行为,在 C# 中等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55311913/