c 中多執行緒訪問winform控制項的若干問題

2022-03-17 12:02:37 字數 1972 閱讀 6626

摘要:

大部分情況下都會碰到使用多執行緒控制介面上控制項資訊的問題。然而我們並不能用傳統方法來解決這個問題,下面我將詳細的介紹。

我們在做winform應用的時候,大部分情況下都會碰到使用多執行緒控制介面上控制項資訊的問題。然而我們並不能用傳統方法來解決這個問題,下面我將詳細的介紹。

首先來看傳統方法:

public

partial

class

form1 : form

private

void form1_load(object

sender, eventargs e)

private

void

threadfuntion()

}}

第一種方案,我們在form1_load()方法中加一句**:

private

void form1_load(object

sender, eventargs e)

下面來看第二種方案,就是使用delegate和invoke來從其他執行緒中控制控制項資訊。網上有很多人寫了這種控制方式,然而我看了很多這種帖子,表明上看來是沒有什麼問題的,但是實際上並沒有解決這個問題,首先來看網路上的那種不完善的方式:

public

partial

class

form1 : form

private

void form1_load(object

sender, eventargs e)

private

void

crossthreadflush()

private

void

threadfuntion()

}}

使用這種方式我們可以看到跨執行緒訪問的異常沒有了。但是新問題出現了,介面沒有響應了。為什麼會出現這個問題, 我們只是讓新開的執行緒無限迴圈重新整理,理論上應該不會對主線程產生影響的。其實不然,這種方式其實相當於把這個新開的執行緒「注入」到了主控制線程中,它取得了主線程的控制。只要這個執行緒不返回,那麼主線程將永遠都無法響應。就算新開的執行緒中不使用無限迴圈,使可以返回了。這種方式的使用多執行緒也失去了它本來的意義。

現在來讓我們看看推薦的解決方案:

public

partial

class

form1 : form

private

void form1_load(object

sender, eventargs e)

private

void

crossthreadflush()

}private

void

threadfunction()

else

}}

對於深山老林提出的問題,我最近找到了更優的解決方案,利用了delegate的非同步呼叫,大家可以看看:

public

partial

class

form1 : form

private

void form1_load(object

sender, eventargs e)

private

void

crossthreadflush()

private

void

threadfunction()

}}

這種方法也可以直接簡化為(因為delegate的非同步就是開了乙個非同步執行緒):

public

partial

class

form1 : form

private

void form1_load(object

sender, eventargs e)

private

void

threadfunction()

}}

WinForm 多執行緒

winform多執行緒程式設計 1.new thread 新開乙個執行緒,執行乙個方法,沒有引數傳遞 private void dowork private void dosomething 新開乙個執行緒,執行乙個方法,並傳遞引數 private void dowork private void ...

C 的WinForm多執行緒應用

vs2005環境下,新建乙個window窗體 命名多執行緒應用 完整 using system using system.collections.generic using system.componentmodel using system.data using system.drawing us...

C 學習 在多執行緒中如何呼叫Winform

問題的產生 我的winform程式中有乙個用於更新主視窗的工作執行緒 worker thread 但文件中卻提示我不能在多執行緒中呼叫這個form 為什麼?而事實上我在呼叫時程式常常會崩掉。請問如何從多執行緒中呼叫form中的 方法呢?解答 每乙個從control類中派生出來的winform類 包括...