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的线程回来继续干活,主线程就不会继续阻塞。