C 多執行緒解決UI介面卡死的問題

2021-09-07 14:25:47 字數 707 閱讀 6169

乙個經典的例子:

問題:都說invoke是同步的,begininvoke是非同步的,但為何用begininvoke做耗時操作依然會卡死ui?

小結:begininvoke的非同步是指相對於呼叫begininvoke的執行緒非同步,而不是相對於ui執行緒非同步。所以在ui執行緒呼叫begininvoke依然會卡死ui。  

解決辦法是開乙個子執行緒,耗時操作在該子執行緒中完成,完成後在子執行緒中呼叫begininvoke交由ui執行緒更新介面,而不是在ui執行緒中呼叫begininvoke。

注意,記好control的invoke和begininvoke都執行在主線程即ui執行緒上!(這是winform的情況,wpf中交由control所關聯的dispatcher來處理,control身上沒有invoke和begininvoke)

測試發現,c#的主線程(ui執行緒)預設是未命名的,name屬性為null。想要知道獲得的執行緒是否為主執行緒,可以在visual studio的【執行緒】視窗中看到,如下圖。既然不知道執行緒的name,那麼還可以通過執行緒的託管id來知曉。

));關於使用manualresetevent使執行緒阻塞與繼續:

C 多執行緒解決UI介面卡死的問題

乙個經典的例子 問題 都說invoke是同步的,begininvoke是非同步的,但為何用begininvoke做耗時操作依然會卡死ui?小結 begininvoke的非同步是指相對於呼叫begininvoke的執行緒非同步,而不是相對於ui執行緒非同步。所以在ui執行緒呼叫begininvoke依...

C 多執行緒解決介面卡死問題的完美解決方案

c 多執行緒解決介面卡死問題的完美解決方案 文章 問題描述 當我們的介面需要在程式執行中不斷更新資料時,當乙個textbox的資料需要變化時,為了讓程式執行中不出現介面卡死的現像,最好的方法就是多執行緒 來解決乙個主線程來建立 介面,使用乙個子執行緒來執行程式並更新 主介面這樣就不會出現卡死的現像了...

C 多執行緒解決介面卡死問題的完美解決方案

文章 問題描述 當我們的介面需要在程式執行中不斷更新資料時,當乙個textbox的資料需要變化時,為了讓程式執行中不出現介面卡死的現像,最好的方法就是多執行緒來解決 乙個主線程來建立介面,使用乙個子執行緒來執行程式並更新主介面 這樣就不會出現卡死的現像了 這肯定是沒有問題的,但是為什麼在使用的過程中...