WinForm 介面非同步更新資料 方式三

2021-09-06 09:39:47 字數 1764 閱讀 9301

control 不能在建立它的 thread 之外被呼叫。但可以通過 invoke 來保證 control 執行緒安全。

在跨執行緒更新的時候,control 會檢查 currentthread 是否為建立 control 的執行緒,並報錯!

示例**如下:

private

void btnstart_click(object

sender, eventargs e)

//報錯:執行緒間操作無效: 從不是建立控制項「lbltime」的執行緒訪問它。

private

void fun(object

datetime)

最簡單的解決方式是在程式**中新增如下屬性:

control.checkforillegalcrossthreadcalls = false;

在多執行緒程式設計中,我們經常要在工作執行緒中去更新介面顯示,而在多執行緒中直接呼叫介面控制項的方法是錯誤的做法,invoke 和 begininvoke 就是為了解決這個問題而出現的,使你在多執行緒中安全的更新介面顯示。

將要做的事情放在工作執行緒中執行,而將對純粹的介面更新放到 ui 執行緒中去做,這樣也就達到了減輕 ui 執行緒負擔的目的。

使用 begininvoke 方法解決該問題的**如下:

using

system;

using

system.collections.generic;

using

system.componentmodel;

using

system.data;

using

system.drawing;

using

system.text;

using

system.windows.forms;

using

system.threading;

namespace

invoke_test

private

void btnstart_click(object

sender, eventargs e)

//定義呼叫方法的委託

delegate

string fundelegate(string

str);

//注意:特地使用 funstart 方法模擬間接呼叫

private

void funstart(object

obj)

//真正需要執行的方法

private

string fun(string

datetime)

}}

control.invokerequired 屬性:當前執行緒不是建立控制項的執行緒時為 true。

也可以認為,在 new control() 的時候,control 用乙個變數記錄下了當前執行緒,在呼叫 invokerequired 時,返回當前執行緒是否不等於 new 的時候記錄下來的那個執行緒。

control.invoke 和 control.begininvoke 就是「發簡訊」的方法,如果使用 control.invoke 發簡訊,那麼甲執行緒就會像個痴情的漢子,一直等待著乙執行緒的回音,而如果使用 control.begininvoke 傳送簡訊,那發完簡訊後,甲執行緒就會忙活自己的,等乙執行緒處理完再來瞧瞧。

示例**:invoke_test.rar

**:

WinForm 介面非同步更新資料 方式三

control 不能在建立它的 thread 之外被呼叫。但可以通過 invoke 來保證 control 執行緒安全。在跨執行緒更新的時候,control 會檢查 currentthread 是否為建立 control 的執行緒,並報錯 示例 如下 private void btnstart cl...

WinForm 介面非同步更新資料 方式一

1 using system 2using system.collections.generic 3using system.componentmodel 4using system.data 5using system.drawing 6using system.linq 7using syste...

winform非同步載入資料到介面

有兩個需求 1.點選按鈕,非同步載入資料,不卡頓ui。2.把獲取的資料載入到gridview上面。對於需求1,2,如下 public delegate void showdatatabledelegate datatable dt private async void button1 click o...