c多執行緒UI無響應,c 多執行緒 UI無響應

時間 2022-07-12 14:21:09

1樓:

因為你在使用多執行緒啊 ,在子執行緒裡面不可以直接操作主線程裡面的控制項,

你主要的問題**在這裡invokerequired 阻塞了 ui執行緒。

請你仔細看看下面的內容吧。

在windows form中使用多執行緒的,最重要的一條注意事項是,除了建立控制項的執行緒以外,絕對不要在任何其他執行緒裡面呼叫控制項的成員(只有極個別情況例外),也就是說控制項屬於建立它的執行緒,不能從其他執行緒裡面訪問。這一條適用於所有從system.windows.

forms.control派生的控制項(因此可以說是幾乎所有控制項),包括form控制項本身也是。控制項的子控制項必須由建立控制項的執行緒來建立,比如乙個表單上的按鈕,比如由建立表單的執行緒來建立,因此,乙個視窗中的所有控制項實際上都活在同乙個執行緒之中。

在實際程式設計時,大多數的軟體的做法都是讓同一執行緒負責全部的控制項,這就是我們所說的ui執行緒。

絕對不要在任何其他執行緒裡面呼叫非本執行緒建立的控制項的成員時,也說了「只有極個別情況例外」,這個invoke方法就是極個別情況之一----invoke方法可以從任何執行緒裡面呼叫。

invoke方法的引數很簡單,乙個委託,乙個參數列(可選),而invoke方法的主要功能就是幫助你在ui執行緒(即建立控制項的執行緒)上呼叫委託所指定的方法。invoke方法首先檢查發出呼叫的執行緒(即當前執行緒)是不是ui執行緒,如果是,直接執行委託指向的方法,如果不是,它將切換到ui執行緒,然後執行委託指向的方法。不管當前執行緒是不是ui執行緒,invoke都阻塞直到委託指向的方法執行完畢,然後切換回發出呼叫的執行緒(如果需要的話),返回。

注意,使用invoke方法時,ui執行緒不能處於阻塞狀態。

但是控制項的begininvoke方法總是使用ui執行緒,而其他的非同步委託呼叫方法則是利用執行緒池裡的執行緒。相對invoke而言,使用begininvoke稍稍麻煩一點,但還是那句話,非同步比同步效果好,儘管複雜些。比如同步方法可能出現這樣一種死鎖情況:

工作者執行緒通過invoke同步呼叫ui執行緒裡的方法時會阻塞,而萬一ui執行緒正在等待工作者執行緒做某件事時怎麼辦?因此,能夠使用非同步方法時應盡量使用非同步方法。

2樓:

這點**別人能看到你幹什麼? 既然是起執行緒了,還居然this.invokerequired)

這個使起的執行緒又回到主線程了。

3樓:逸聞軒科技

確實沒看明白,**給詳細點

這上面完全沒有反應到ui相關的**

c#多執行緒啟動後ui介面無響應

4樓:可以叫我表哥

程式啟動的時候會建立乙個主線程,這個執行緒叫ui執行緒,從字面理解就可以知道這個執行緒專門處理有關ui(也就是介面)所有的事件。介面卡是因為,你進入了比如點選事件裡面,執行緒一直在處理這個任務,這個任務一直沒返回,也就是這個方法一直沒返回。所以這個時候你點選介面是沒反應的,也就是假死狀態。

如果需要處理乙個長時間的任務,應該建立乙個新執行緒b去處理。同時b要去修改介面的話,需要用委託。因為介面是主線程負責,用委託是把修改介面這個動作交給主線程去做,如果由b去做的話可能會造成死鎖之類問題

c#從另外乙個執行緒操作windows窗體上的控制項,必須要使用委託,通過委託呼叫ui執行緒去操控控制項

//這個是窗體執行緒mainfrm

public delegate void delegate_changecallback(string _value);

public delegate_changecallback dlg_change;

public static mainfrm mainfrm;

private void mainfrm_load(object sender, eventargs e)

private void changeui(string _value)

private void button1_click(object sender, eventargs e)//下面是你的新執行緒

class client);}}

5樓:路有時不在腳下

沒有看明白你用多執行緒要實現什麼效果?你宣告dowork()方法是在主線程執行的,不是在你宣告的副執行緒中執行,那介面怎麼會動呢?

你執行了乙個副執行緒,起到的作用就是執行了test()方法,沒有停留就轉到了主線程執行dowork()方法了,實際效果:相當於點選開始執行的是dowork()方法。

如果你想使用多執行緒實現數字隔一秒重新整理一次,那麼你的迴圈**應該放到test()方法中。ok。

c# 多執行緒 新開子執行緒中暫停,呼叫主線程式控制件,如何防止ui阻塞?

6樓:匿名使用者

又是多執行緒,新開的子執行緒要訪問主線程的ui必須借用委託,不然.net的執行緒安全機制會報錯說不支援跨執行緒操作。搞個例子給你看看。

c#窗體中使用sleep後無響應

7樓:爾離好活笑

估計是發生死鎖了。我記得昨天有人問過這個問題,沒有上下文環境,我們很難幫到你。有沒有日誌,看看執行緒日誌。

c#程式設計如何避免程式未響應出現

8樓:

使用 backgroundworker 控制項。詳見:

9樓:匿名使用者

用多執行緒實現,親,把獲取網頁**打包,扔到執行緒裡執行就ok了~

c# winform程式,ui介面鎖死。如何處理?

10樓:匿名使用者

不要用定時器 開個執行緒 後天處理資料 然後ui填充 等動作。

你以上設定 定時器 1秒執行一次 無限在觸發。。

11樓:主得存

一般情況都是放在子執行緒中執行。這樣既保證效率,方便管理

VC 多執行緒,c 多執行緒問題

當多個執行緒訪問乙個獨占性共享資源時,可以使用 臨界區 物件。任一時刻只有乙個執行緒可以擁有臨界區物件,擁有臨界區的執行緒可以訪問被保護起來的資源或 段,其他希望進入臨界區的執行緒將被掛起等待,直到擁有臨界區的執行緒放棄臨界區時為止,這樣就保證了不會在同一時刻出現多個執行緒訪問共享資源。ccriti...

c多執行緒操作控制元件問題,C 多執行緒操作控制元件問題

一樓的答案不僅不是正解,而且還會報錯!正確的做法如下 thread th new thread new threadstart th.isbackground true 一定要標記為後臺執行緒,這樣這個執行緒才能在你的主執行緒停止後自動停止 th.start 總之一句話,繁瑣的業務操作放在非主執行緒...

求c建立多執行緒的作用和方法

在.net中,多執行緒功能是在system.threading命名空間中定義的。因此,在使用任何執行緒類之前,必須定義 system.threading命名空間。定義方法如下 using system.threading 啟動執行緒system.threading命名空間中的thread類代表乙個執...