为什么等待不等?
这是我的实际代码:
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模式时,我们应该采用这种方式,直到第一个方法启动它。 否则,通过显式调用Wait
或Result
,我们可能会遇到死锁问题。 此外,显式调用那些阻止执行线程的方法。 所以你放弃使用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