多線程訪問窗口控件時異常問題

[.net 1.1下允許異步訪問,不會有異常]

在新線程中訪問主線程的窗體控件時會發生錯誤,這個問題大家都知道的。
本來以爲只要訪問控件的代碼寫在窗體的方法中就ok了的,今天試驗了一下卻發生錯誤了。
原因是.net 1.1下允許,.net 2.0下不允許了。

我的代碼是這樣的:有兩個類,一個是窗體類,一個是某邏輯實現類,構造窗體(Load)時建立一個邏輯實現對象,訂閱邏輯實現對象的一個事件,當事件發生時執行訪問控件的代碼。
當程序運行的時候出現了一個線程不安全的警告,真是沒想到呀。後來想這個代碼是委託調用的呀,既然委託了就是由新線程來負責調用的了,那麼這個警告就是合情合理的了。

那麼真正正確的編碼方式是什麼哪?翻看幫助,找到兩種實現方式:

1.同步方法 this.Invoke()
private void SetText(string text)
{
    
// InvokeRequired:獲取一個值,該值指示調用方在對控件進行方法調用時是否必須調用 Invoke 方法,因爲調用方位於創建控件所在的線程以外的線程中。
    if (this.textBox2.InvokeRequired)   
    
{
        setText st 
= new setText(SetText);
        
this.Invoke(st, new object[] { text });    // Invoke:在擁有此控件的基礎窗口句柄的線程上執行委託。
    }

    
else
    
{
        
this.textBox2.Text += text;
    }

}


2. backgroundWorker 類,.net 2.0 中新增類

這個類有3個主要事件:
DoWork 後臺任務事件(能有多個任務嗎?待驗證!)
委託定義有兩個參數
object sender  --backgroundWorker 對象
DoWorkEventArgs e  --e.Result 可以保存後臺任務的結果

RunWorkerCompleted 後臺任務完成時事件,可在委託任務中訪問調用線程的對象;
DoWork 委託中能不能訪問調用線程的對象?沒有試驗過,不過在後臺任務中訪問調用線程的對象也不對頭。
委託定義有兩個參數
object sender  --backgroundWorker 對象
RunWorkerCompletedEventArgs e  --e.Error 可判斷後臺任務是否有異常發生;e.Cancelled 可判斷後臺任務是否被中止了

ProgressChanged 後臺任務進度獲取事件
委託定義有兩個參數
object sender  --backgroundWorker 對象
ProgressChangedEventArgs e  --e.ProgressPercentage 表示進度百分比

有2個主要方法:
RunWorkerAsync() 後臺任務開始執行

ReportProgress() 後臺任務進度信息發佈
方法有一個參數
int percentProgress  --任務的進度0-100間的值;調用時觸發 backgroundWorker 對象的 ProgressChanged 事件
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章