这是我的实际代码:
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 模式时,我们应该这样做,直到第一个方法启动它。否则,通过显式调用 Wait
或 Result
,我们可能会遇到死锁问题。此外,显式调用这些方法会阻塞正在执行的线程。所以你放弃了使用 async/await 的主要好处,它不会阻塞正在执行的线程,而是在一个单独的线程上运行一些代码,一旦完成,就从你停止的地方恢复代码的执行。
关于c# - 为什么等待不等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45365214/