如果不用背景來跑一些要跑很久的程式的話,主要的程式介面會當在那邊等你跑完他才會動

像當機一樣,故可以拉一個BackgroundWorker元件來用(或是用程式的寫法),

把要跑很久的工作丟到另外一個執行緒去

在WinForm中,有個規定就是建立控制項的執行緒才能存取這個控制項,

所以如果要更新主視窗的控制項的話,就要用主視窗的執行緒

//宣告
private BackgroundWorker background;

//在Form_Load事件裡設定這個元件
background = new BackgroundWorker();
background.WorkerReportsProgress = true;
background.WorkerSupportsCancellation = true;
background.DoWork += new DoWorkEventHandler(background_DoWork);
background.ProgressChanged += new ProgressChangedEventHandler(background_ProgressChanged);
background.RunWorkerCompleted += new RunWorkerCompletedEventHandler(background_RunWorkerCompleted);


private void background_DoWork(object sender, DoWorkEventArgs e)
{
//之後把繁重的工作丟到這個DoWork裡來
//但是在這裡面因為是不同的執行緒的關係,所以不能去設定主介面的控制項的值

//假設要把一個處理完的DataTable存在一個變數讓另一個執行緒也可以存取的話

// 就用e.Result=dt;
}

private void background_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//這裡是程式回報時會觸發的事件,在這可去控制主介面控制項的值
//可接收兩種變數,一個是Int,一個是物件(用ToString()就變字串啦)
//分別是e.ProgressPercentage跟e.UserState這兩個
}

private void background_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{

//這裡是程式完成時會觸發的事件,在這可去控制主介面控制項的值
//這是 background執行緒結束後會觸發的值
//結束不一定代表成功喔

//這邊可以接DoWork裡面存的e.Result的DataTable變數

//就用((DataTable)e.Result),前面是轉型回DataTable
}


//要怎麼讓程式去做DoWork裡面的程式呢,只要在像是Button_Click事件裡加這行就可
background.RunWorkerAsync();

//要怎麼在別的程式回報狀況呢
//就是先從剛剛的主介面傳new出來的background到別的函式去
//然後別的函式用下面的BackgroundWorker background方法接受background
public void Hello(BackgroundWorker background)
{
//接著在這邊寫一行程式就可以去觸發主介面裡的background_ProgressChanged 事件
background.ReportProgress(這裡可以傳一個Int的變數回去, 而這裡雖然型態是物件型態,但是可以放字串在這裡傳回去);

}

補充:

if(background.CancellationPending)可判斷是否取消執行緒的動作了

取消是用background.CancelAsync();

判斷執行緒是不是還在作業就用if(background.IsBusy)

welkingunther 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • 訪客
  • 謝謝歐~!