Winform 執行緒修改UI介面元素的值

2022-02-22 02:01:57 字數 1032 閱讀 9139

之前在做winform應用的時候,使用多執行緒控制介面上控制項資訊,時常碰到invalidoperationexception這個異常!這個異常的出現多數情況是由於worker執行緒(子執行緒)修改主線程式控制件(或物件)的屬性而導致的非法操作。這是因為.net 2.0以後加強了安全機制,不允許在winform中直接跨執行緒訪問控制項的屬性。參照網上的例子,自己總結了一下解決的方法:

一.我們在窗體載入的時候form1_load()方法中加一句**:

private

void testthreadform _load(object

sender, eventargs e)

加入這句**以後發現程式可以正常執行了。這句**就是說在這個類中我們不檢查跨執行緒的呼叫是否合法(如果沒有加這句話執行也沒有異常,那麼說明系統以及 預設的採用了不檢查的方式)。然而,從安全性方面看,這種方法不可取。checkforillegalcrossthreadcalls容許子執行緒隨時更新ui,在同乙個函式體內,不能保證自身事務的一致性。如給lable賦值,可能一回頭,就已經給別人修改了,當然你可以自己加鎖,用訊號量,但工作量又多了,而且如果在專案中多處需要跨純種訪問控制項,那就要重複又重複新增!我們要採取另外的方案。

二.方案二是使用delegate和invoke來從其他執行緒中控制控制項資訊。

public

partial

class

testthreadform : form

private

void form1_load(object

sender, eventargs e)

private

void

crossthreadflush()

}private

void

threadfunction()

else

}}

用第二種方案,我們可以解決了跨純種訪問控制項的屬性和資訊,通過等待非同步,不需要總是持有主線程的控制,這樣就可以在不發生跨執行緒呼叫異常的情況下完成多執行緒對winform多執行緒控制項的控制了。

WIN FORM 多執行緒更新UI 介面控制項

方法1,更新單個控制項 public delegate void controltextmethod control control,string text private void setcontroltext control control,string text else 需要更新控制項的te...

C WinForm跨執行緒修改UI介面

在我做winform開發的過程中,經常會遇到耗時操作或阻塞操作。他們會引發軟體的卡頓甚至假死,嚴重影響軟體的使用。因此,這類耗時或阻塞的操作一般都會使用非同步的方式去執行,不影響主線程 ui執行緒 與使用者間的互動。但多個執行緒競爭讀寫同乙個資源往往會造成意想不到的意外結果,ui介面也是一種資源,所...

Winform之UI後台執行緒

多執行緒,乙個古老的話題,今天我來聊下最基本的執行緒,ui執行緒和後台執行緒。在後台執行緒中直接操作ui控制項會出現異常 執行緒間操作無效 從不是建立控制項 xx 的執行緒訪問它 怎麼解決這個問題那?關鍵點在 和invokerequired屬性,winform的ui 視窗 如下 using syst...