程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#多線程編程(1) —— 多線程與UI操作

C#多線程編程(1) —— 多線程與UI操作

編輯:C#入門知識

    為了讓程序盡快響應用戶操作,在開發Windows應用程序時經常會使用到線程。

    對於耗時的操作如果不使用線程將會是UI界面長時間處於停滯狀態,這種情況是用戶非常不願意看到的,在這種情況下我們希望使用線程來解決這個問題。

    先看一段代碼:

                 
           btnStartThread_Click(              progressBar.Value =              Thread thread =  Thread(   
                         (progressBar.Value <         }

    程序的界面中包含一個按鈕和一個進度條。

    我們的本意是點擊“啟動”按鈕來啟動模擬一個操作,在進度條中顯示操作的總體進度。不過如果我們真的點擊“啟動”按鈕會很失望,因為它會拋出一個System.InvalidOperationException異常,異常描述就是“線程間操作無效: 從不是創建控件‘progressBar’的線程訪問它。”

解決方案一:CheckForIllegalCrossThreadCalls屬性   

    之所以會出現這樣的情況是因為在.NET中做了限制,不允許在調試環境下使用線程訪問並非它自己創建的UI控件,這麼做可能是怕在多線程環境下對界面控件進行操作會出現不可預知的情況,如果開發者可以確認自己的代碼操作界面不會出現問題,可以用比較簡單的方法解決,那就是設置CheckForIllegalCrossThreadCalls這個靜態屬性,它默認是true,如果將其設為false的話,以後在多線程環境下操作界面也不會拋出異常了,我們上面的代碼可以修改為:

    btnStartThread_Click(= = ;  
            Thread thread =  Thread(  (progressBar.Value <

 

方案二:Invoke方法來操作界面

   
           SetProgressBarValue(  btnStartThread2_Click(= =  Thread(
          value = (value <
                .Invoke( SetProgressBarValue(SetProgressValue), ++= ++
          SetProgressValue(
            progressBar.Value =

解決方案三:BackgroundWorker類操作界面

    btnBackgroundWorker_Click(= = += 
            backWorker.ProgressChanged += 
            backWorker.RunWorkerCompleted += = ;
            backWorker.WorkerSupportsCancellation = ;
            backWorker.RunWorkerAsync();
= 
         worker_RunWorkerCompleted(= 
         worker_ProgressChanged(
            progressBar.Value =
         worker_DoWork( value = (value <++value);

解決方案四:Timer方式

  
          btnTimer_Click(= 
            System.Windows.Forms.Timer timer = = += = 
         timer_Tick( value = (value <= value + 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved