为什么等待不等?

这是我的实际代码:

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 = new Task(getData); task.Start(); task.Wait(); Console.WriteLine("Step 3"); } 

我得到以下输出:

 Step 1 Step 3 OK Step 2 

为什么Step 3不会在Step 2 Step 3之后出现?

如何让它按顺序工作,即只返回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的主要好处,它不会阻塞正在执行的线程并在一个单独的线程上运行一些代码,一旦完成,就会从你停止的地方恢复执行代码。

尝试简单明了地放置东西 – async Task (和 )方法本身负责分配代表其完成的Task对象。

如果您发现自己使用async方法自己分配Task对象(直接,如此处,或使用静态工厂方法,如Task.Run ),您必须认识到现在存在多个Task对象。 你必须小心并认识到你在这里创建自己现在返回Task的情况。

如果可能的话,最好一直拥抱async (当你将每个函数修改为async ,你会倾向于找到每个调用站点并使该位置async ),并自行停止分配任何Task