c# - 为什么等待不等待?

标签 c# .net async-await task

这是我的实际代码:

    async Task getData()
    {
        Thread.Sleep(5000);
        Console.WriteLine("Step 1");

        using (HttpClient api = new HttpClient()) 
            await api.GetAsync("http://google.com/").ContinueWith(
                (getTask) =>
                    Console.WriteLine(getTask.Result.StatusCode);
            );

        Console.WriteLine("Step 2");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Task<Task> task = new Task<Task>(getData);
        task.Start();
        task.Wait();
        Console.WriteLine("Step 3");
    }

我得到以下输出:

Step 1
Step 3
OK
Step 2

为什么 Step 3 不在 Step 2 之后?

如何让它按顺序工作,即仅在 getData 中的所有内容完成之前返回给 getData 的调用者?

最佳答案

您还应该将事件处理程序标记为 async

private async Task button1_Click(object sender, EventArgs e)

await 而不是 Wait:

private async Task button1_Click(object sender, EventArgs e)
{
    await getData();

    Console.WriteLine("Step 3");
}

当我们使用 async/await 模式时,我们应该这样做,直到第一个方法启动它。否则,通过显式调用 WaitResult,我们可能会遇到死锁问题。此外,显式调用这些方法会阻塞正在执行的线程。所以你放弃了使用 async/await 的主要好处,它不会阻塞正在执行的线程,而是在一个单独的线程上运行一些代码,一旦完成,就从你停止的地方恢复代码的执行。

关于c# - 为什么等待不等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45365214/

相关文章:

c# - C# 中的 LINQ 查询使用动态字符串来 ORDER 数据

javascript - 让 React 在长时间运行的任务之间渲染页面

c# - 使用javascript在网页上自动登录和解析

c# - 从 VS2010 运行时,应用程序只是关闭(没有错误或错误)

c# - 深色/浅色主题 Assets 限定符

Python 协程不与 time.sleep() 同时运行?

javascript - 在 React-Native 的非异步函数中调用异步函数 - Firebase

c# - 这个图案的名字? (回答 : lazy initialization with double-checked locking)

c# - C#中VB6中ObjPtr的等效(功能)?

c# - .net core 2 的编码问题