假如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支持
Task<string> t = Task.Factory.StartNew(() =>
{
return doSth();
});
//線程執行返回的值
//t.GetAwaiter().OnCompleted(() =>
// {
// label1.Text = t.Result;
// });
}