control 不能在建立它的 thread 之外被呼叫。但可以通過 invoke 來保證 control 執行緒安全。
在跨執行緒更新的時候,control 會檢查 currentthread 是否為建立 control 的執行緒,並報錯!
示例**如下:
privatevoid btnstart_click(object
sender, eventargs e)
//報錯:執行緒間操作無效: 從不是建立控制項「lbltime」的執行緒訪問它。
private
void fun(object
datetime)
最簡單的解決方式是在程式**中新增如下屬性:
control.checkforillegalcrossthreadcalls = false;
在多執行緒程式設計中,我們經常要在工作執行緒中去更新介面顯示,而在多執行緒中直接呼叫介面控制項的方法是錯誤的做法,invoke 和 begininvoke 就是為了解決這個問題而出現的,使你在多執行緒中安全的更新介面顯示。
將要做的事情放在工作執行緒中執行,而將對純粹的介面更新放到 ui 執行緒中去做,這樣也就達到了減輕 ui 執行緒負擔的目的。
使用 begininvoke 方法解決該問題的**如下:
usingsystem;
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...