關於異步更新UI界面多線程執行後臺操作的一些思路整理

有些時候,某些操作會比較耗時間(如:連接一個沒有開啓的遠程數據庫),如果這個操作在UI線程上執行的話,就會在返回之前,讓界面處於"假死"狀態,影響用戶體驗.因此,從其他線程操作這類的"耗時"操作,是很有必要的,這裏我主要整理當前,.net框架下,託管代碼中線程安全的情況,因此,關閉掉線程安全檢查來實現跨線程的界面更新操作不在討論範疇.

我主要說說beginInvoke操作,這是一個異步的多線程調用.原理大家直接看msdn或者相關的大牛的科普分析就是了,我先說理論:

1.控件可以調用beginInvoke方法,並且可以傳遞參數列表(一個委託,參數數組),因此用你想更新的UI界面的控件來調用,是很理想的,用窗體本身,也行

2.由1知道,調用需要一個委託,因此,要聲明一個委託類型,這個委託就是要異步執行的方法的委託實例的類型,這裏有點兒拗口,知道這個委託時異步執行的就行UI更新

3.委託只是一個調用,因此需要一個單獨的新線程來運行你的"耗時線程",這樣就脫離了用戶界面了.

4.開始這條新線程.

------------------------------下面是編碼的步驟:裏面的單詞不是關鍵字,只是一個描述標示--------------------------------

1.聲明一個委託類型,參數列表和你更新UI的方法參數列表相同 ,我用delegate表示

2.編寫你的ui更新方法的代碼代碼,參數列表要和委託相同(會用來實例化我們的delegate),我用updateUI

3.寫一個方法,這個方法會執行你的耗時操作和調用我們上面的delegate,也就是我們的新線程,參數列表最好爲空,因爲在開線程的時候,用來實例化threadState委託實例,我用thread表示.

4.注意:一定要在3中的方法裏面實例化一個1中的deletegate,用控件調用beginInvoke,參數中的委託就用實例化的delegate

5.在你想執行這些操作的地方,開啓新線程,調用3中的方法thread,並開始線程,就可以了

6.有什麼不正確的地方,請大俠不要飄過,多多指教,有什麼疑問的地方,請留言,共同討論,另外需要demo參考的,也可以在評論裏面聯繫我

7.謝謝各位看官,總結完畢.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章