死锁案例

 1 public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         private void Form1_Load(object sender, EventArgs e)
 9         {
10 
11         }
12 
13         private   void button1_Click(object sender, EventArgs e)
14         {
15             Console.WriteLine("当前线程:"+ Environment.CurrentManagedThreadId.ToString());
16             //ConfigureAwait(true) 任务结束后还回到原来的线程 ConfigureAwait(false) 不回到原来的线程 
17             //int result = await HeavyJob().ConfigureAwait(true);
18             int result =  HeavyJob().Result;
19             this.label1.Text = result.ToString();
20             Console.WriteLine("当前线程:" + Environment.CurrentManagedThreadId.ToString());
21         }
22 
23         async Task<int> HeavyJob()
24         {
//await以上的代码此时其实还是在ui线程中,await之后如果ConfigureAwait(false),则线程不同
25 await Task.Delay(6000);
               //await Task.Delay(6000).ConfigureAwait(false);
26             return 12;
27 }

28 }
HeavyJob().Result会阻塞当前线程, HeavyJob中Task.Delay(6000)在Delay之后回到ui线程上,但是此时UI线程被阻塞了(因为HeavyJob().Result,Result方法会阻塞UI线程
这样就导致了矛盾,界面一直卡住。
解决方法将HeavyJob中的注释部分解除即可。但是效果是点击按钮之后,界面卡顿6S,6S后界面可以自由拖动。
HeavyJob()ConfigureAwait(false),意思是在执行完await Task.Delay(6000)后,不回到ui线程,让Delay的线程回来继续干活,主线程就不会继续阻塞。
posted @ 2024-07-14 14:13  NoTimeFF  阅读(20)  评论(0)    收藏  举报