gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:00:31 27 4
gpt4 key购买 nike

这是我的实际代码:

    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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com