Csharp/C#教程:为什么等待不等?分享


为什么等待不等?

这是我的实际代码:

async Task getData() { Thread.Sleep(5000); Console.WriteLine("Step 1"); using (HttpClient api = new HttpClient()) await api.GetAsync("https://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

上述就是C#学习教程:为什么等待不等?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/950131.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐