多執行緒與UI操作

2022-08-29 13:57:27 字數 1443 閱讀 3475

什麼是ui執行緒?

所有的 .net framework 應用程式都是使用單執行緒建立的,單執行緒用於執行該應用程式, 在.net winform開發中,這樣的執行緒建立並管理使用者介面 (ui),因而稱為 ui 執行緒。

什麼是ui假死?

當winfrom程式在執行乙個長時間耗時的任務時,應用程式出現不能點選、移動,看起來是程式已經死掉的現象(其實還在跑);

展開

private

void add()

}private

void button1_click(object sender, eventargs e)

上面應用程式目的是在介面顯示乙個數的累加1的過程,當點選button時,程式就出現了假死的現象.

怎麼解決?

解決的方法就是使用ui 執行緒中的非同步呼叫,用乙個執行緒去處理乙個耗時間的任務。

view code

private

void button1_click(object sender, eventargs e)

修改button_click事件,建立乙個執行緒去處理add這個方法。

修改後再執行時,會報以下錯誤

這是因為微軟為了執行緒安全,不是ui執行緒的不能去處理介面。處理方法就是使用控制項的 invokerequired 屬性判斷是否跨執行緒操作,如果需要則使用 invoke 方法**形式操作。

改進**

1

private

void add()

2

11else

12

15this.label1.text = i.tostring();

16 thread.sleep(1000);

17 }

18 }

1920

private

void write(string str)

21

現在執行程式時, 應用程式就不會出現假死的情況了。當然這不是很好的解決方法,如果要修改多個控制項的話,就要新建多個像write那樣的方法了,這樣**反而不好閱讀了。  解決方式就是用匿名方法,開始動手

修改

label1.invoke(delegate() );
編譯,還是會報錯,無法將 匿名方法 轉換為型別「system.delegate」,因為它不是委託型別 ,這是神馬情況 ,google一下原因後,原來invoke第乙個引數接受的是delegate型別,而不是具體的委託型別,所以clr無法知道是哪種委託,繼續修改,將delegate轉換為具體的委託

label1.invoke((methodinvoker)delegate() );

C 程式設計 多執行緒與UI操作

為了讓程式盡快響應使用者操作,在開發windows應用程式時經常會使用到執行緒。對於耗時的操作如果不使用執行緒將會是ui介面長時間處於停滯狀態,這種情況是使用者非常不願意看到的,在這種情況下我們希望使用執行緒來解決這個問題。簡單貼出幾種處理情況的 慢慢琢磨吧!csharp view plain co...

SWT多執行緒 關於非UI執行緒操作UI執行緒(二)

隨後需要在乙個新開啟的視窗後啟動乙個執行緒讀取乙個物件並按秒重新整理介面顯示。仍然使用非同步執行緒實現。方法為 1 建立乙個執行緒 public class testthread extends thread public void run catch exception e display.asy...

C 多執行緒間操作UI

通過設定ui控制項的invoke和begininvoke方法實現更新,如下 1 public partial class fifth form28 private void settext string text 912 13private void fifth load object sender...