本文共 1246 字,大约阅读时间需要 4 分钟。
假如winform頁面上 有兩個按鈕,Button1 ,Button2, Button2的執行時間需要N秒,點擊Button2時會導致期間整個頁面無法移動,包括Button1無法點擊等等,即頁面處於假死狀態。 例如 Button2的代码如下:
`private void butto2_Click(object sender, EventArgs e) { doSth();//執行時間長的事件 } ///button2執行的事件 private string doSth() { for (int i = 0; i < 10; i++) { //下面用 Sleep代替要執行的代碼,,,,表示執行時間比較久 Thread.Sleep(1000); } return "執行完成了"; }
`
这时點擊Butto2會出現頁面假死。原因及解决方法如下:原因:我们知道winform中control的事件默認是由主線程 UI执行,Button2的事件由於執行時間長導致UI線程阻塞,造成頁面假死沒反應。
解決方法:可以用多線程,即在Button2代碼中采用子線程去調用執行時間久的事件代碼改為:
private void butto2_Click(object sender, EventArgs e) { //1.用 Thread類 doSth 不帶參數 //Thread thr = new Thread(new ThreadStart(doSth)); //thr.Start(); //doSth 帶參數 //Thread thr = new Thread(new ParameterizedThreadStart(doSth)); //thr.Start(對像參數); //2.或者用 Task ,需要高版本 framework支持 Taskt = Task.Factory.StartNew(() => { return doSth(); }); //線程執行返回的值 //t.GetAwaiter().OnCompleted(() => // { // label1.Text = t.Result; // }); }
转载地址:http://inmdi.baihongyu.com/