c# wait 和async,await一起使用引发的死锁问题

科技资讯 投稿 45200 1 评论

c# wait 和async,await一起使用引发的死锁问题

async,await,wait三者一起使用会引发一个必然性的死锁问题。

   

1.触发Button_Click事件之后,会调用Run方法,主线程会开始执行Run方法中的代码。

3.然而由于await关键字的机制,在UI线程中调用await关键字后,Task.Run后面的代码同步交给UI线程去执行,即使后面没有代码需要执行。然而这个时候的UI线程正在等待Run中的线程执行完成,这就造成了一个非常典型的死锁问题。

当然,在UI线程中为了保持UI的响应性,一般也很少会使用wait关键字来等待一个线程。只不过当你在开发一个类库给项目中的其他人员使用的时候,为了避免使用者使用不当,还是 建议在线程之后加上ConfigureAwait(false,将其配置为在UI线程不可等待。

await Task.Run((=> {}.ConfigureAwait(false;

这是因为在非UI线程中,第四步的代码会从线程池中抓取空闲线程执行,而await的调用线程不可能是空闲线程,所以就不会产生于类似的死锁问题。

一旦在代码中使用了await 、async,最好一直使用,一定要避免使用方法。

编程笔记 » c# wait 和async,await一起使用引发的死锁问题

赞同 (50) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(1)个小伙伴在吐槽
  1. 读起来非常流畅。
    白衣飘飘 2023-09-10 22:00 (2年前) 回复