之前在做winform應用的時候,使用多執行緒控制介面上控制項資訊,時常碰到invalidoperationexception這個異常!這個異常的出現多數情況是由於worker執行緒(子執行緒)修改主線程式控制件(或物件)的屬性而導致的非法操作。這是因為.net 2.0以後加強了安全機制,不允許在winform中直接跨執行緒訪問控制項的屬性。參照網上的例子,自己總結了一下解決的方法:
一.我們在窗體載入的時候form1_load()方法中加一句**:
privatevoid testthreadform _load(object
sender, eventargs e)
加入這句**以後發現程式可以正常執行了。這句**就是說在這個類中我們不檢查跨執行緒的呼叫是否合法(如果沒有加這句話執行也沒有異常,那麼說明系統以及 預設的採用了不檢查的方式)。然而,從安全性方面看,這種方法不可取。checkforillegalcrossthreadcalls容許子執行緒隨時更新ui,在同乙個函式體內,不能保證自身事務的一致性。如給lable賦值,可能一回頭,就已經給別人修改了,當然你可以自己加鎖,用訊號量,但工作量又多了,而且如果在專案中多處需要跨純種訪問控制項,那就要重複又重複新增!我們要採取另外的方案。
二.方案二是使用delegate和invoke來從其他執行緒中控制控制項資訊。
publicpartial
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...