為了讓程序盡快響應用戶操作,在開發Windows應用程序時經常會使用到線程。
對於耗時的操作如果不使用線程將會是UI界面長時間處於停滯狀態,這種情況是用戶非常不願意看到的,在這種情況下我們希望使用線程來解決這個問題。
先看一段代碼:
btnStartThread_Click( progressBar.Value = Thread thread = Thread( (progressBar.Value < }
程序的界面中包含一個按鈕和一個進度條。
我們的本意是點擊“啟動”按鈕來啟動模擬一個操作,在進度條中顯示操作的總體進度。不過如果我們真的點擊“啟動”按鈕會很失望,因為它會拋出一個System.InvalidOperationException異常,異常描述就是“線程間操作無效: 從不是創建控件‘progressBar’的線程訪問它。”
之所以會出現這樣的情況是因為在.NET中做了限制,不允許在調試環境下使用線程訪問並非它自己創建的UI控件,這麼做可能是怕在多線程環境下對界面控件進行操作會出現不可預知的情況,如果開發者可以確認自己的代碼操作界面不會出現問題,可以用比較簡單的方法解決,那就是設置CheckForIllegalCrossThreadCalls這個靜態屬性,它默認是true,如果將其設為false的話,以後在多線程環境下操作界面也不會拋出異常了,我們上面的代碼可以修改為:
btnStartThread_Click(= = ; Thread thread = Thread( (progressBar.Value <
SetProgressBarValue( btnStartThread2_Click(= = Thread( value = (value < .Invoke( SetProgressBarValue(SetProgressValue), ++= ++ SetProgressValue( progressBar.Value =
btnBackgroundWorker_Click(= = += backWorker.ProgressChanged += backWorker.RunWorkerCompleted += = ; backWorker.WorkerSupportsCancellation = ; backWorker.RunWorkerAsync(); = worker_RunWorkerCompleted(= worker_ProgressChanged( progressBar.Value = worker_DoWork( value = (value <++value);
btnTimer_Click(= System.Windows.Forms.Timer timer = = += = timer_Tick( value = (value <= value +