winform主线程执行耗时操作或循环时,会导致窗口不响应,也看不到控件的更新:
方案1:主线程中开启循环,耗时操作放在子线程中处理,控件在主线程中修改。
private async void button1_Click(object sender, EventArgs e) { int i = 0; while (true) { await Task.Run(() => { i++; Thread.Sleep(1000); }); label1.Text = i.ToString(); } }
注意:使用【await Task.Run】开启并等待一个线程,await关键字可以让控制权返回到主线程,保证主线程不卡顿。
方案2:先开子线程,再子线程中开启循环,耗时操作放在子线程中处理,再在子线程里指定主线程来调用修改控件。
private void button1_Click(object sender, EventArgs e) { int i = 0; Task.Run(() => { while (true) { this.Invoke(new Action(() => { label1.Text = i.ToString(); })); i++; Thread.Sleep(1000); } }); }
注意:子线程不能修改主线程创建的控件,需要使用【this.Invoke】指定使用主线程执行一个委托方法。
标签:控件,Task,Run,await,主线,响应,线程,刷新,winform From: https://www.cnblogs.com/ariter/p/16802898.html