c# - 无法理解异步的行为,在 C# 中等待

标签 c# async-await task

我正在学习 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/

相关文章:

task - JIRA/Greenhopper 在更新子任务时更新故事

C# XAML UWP InvalidCastException 与 MySQL

javascript - try..catch 没有捕捉到异步/等待错误

c# - ValueTask 有 ContinueWith 吗?

c# - 在 Azure Function Service Bus 触发器中使用异步方法

c# - Tpl 的延续和异常(exception)?

c# - 需要一种更改远程用户密码的方法 - NetUserChangePassword 失败并返回 2245

c# - 如何为一组具有几乎相同功能但具有不同参数和返回类型的类创建接口(interface)?

C# Entity Framework 保存具有多对多导航属性的记录

c# - 如何让普通的 WebRequest 异步且可等待?