跨執行緒呼叫控制項的幾種方式

2022-02-15 05:23:46 字數 4027 閱讀 8431

有乙個函式,它的功能就是載入資料,然後繫結到datagridview。現在開啟乙個執行緒去執行這個函式。結果可想而知,它會報錯:提示執行緒無法訪問。。。之類的話。為什麼報錯呢?因為你在開啟的執行緒中操作了datagridview控制項,也就是跨執行緒呼叫控制項了。 那麼我們應該怎麼跨執行緒呼叫控制項呢?跨執行緒呼叫控制項的幾種方法。

using

system;

using

system.collections.generic;

using

system.componentmodel;

using

system.data;

using

system.drawing;

using

system.linq;

using

system.text;

using

system.threading;

using

system.threading.tasks;

using

system.windows.forms;

namespace

private

void button1_click(object

sender, eventargs e)

//////

定義委託

/// private

delegate

void

invokedelegate();

//////

this.label1.invokerequired就是問問我們要不要使用**執行modifylabeltext方法

/// private

void

modifylabeltext()

else}}

}

使用begininvoke和delegate的方式。(也叫**方式)

using

system;

using

system.collections.generic;

using

system.componentmodel;

using

system.data;

using

system.drawing;

using

system.linq;

using

system.text;

using

system.threading;

using

system.threading.tasks;

using

system.windows.forms;

namespace

private

void button1_click(object

sender, eventargs e)

//////

定義委託

/// private

delegate

void

invokedelegate();

//////

this.label1.invokerequired就是問問我們要不要使用**執行modifylabeltext方法

/// private

void

modifylabeltext()

else}}

}

使用backgroundworker元件(推薦使用這個方法)

(2)工作原理:該控制項有三個事件:dowork 、progresschanged 和 runworkercompleted。在程式中呼叫runworkerasync方法則會啟動dowork事件的事件處理,當在事件處理過程中,呼叫 reportprogress方法則會啟動progresschanged事件的事件處理,而當dowork事件處理完成時,則會觸發runworkercompleted事件。您必須非常小心,確保在 dowork 事件處理程式中不操作任何使用者介面物件(否則仍會停止響應)。而應該通過 progresschanged和 runworkercompleted 事件與使用者介面進行通訊。

using

system;

using

system.collections.generic;

using

system.componentmodel;

using

system.data;

using

system.drawing;

using

system.linq;

using

system.reflection;

using

system.text;

using

system.threading;

using

system.threading.tasks;

using

system.windows.forms;

namespace

workerbackgrounderexmple

private

static

int maxrecords = 100

;

private

void btnstart_click(object

sender, eventargs e)

this

.listview1.items.clear();

this

.backgroundworker1.runworkerasync(maxrecords);

this.btnstart.enabled= false

;

this.btncancel.enabled= true

; }

private

void backgroundworker1_dowork(object

sender, doworkeventargs e)

catch

(exception ex)

}private

intretrievedata(backgroundworker worker, doworkeventargs e)

percent=(int)(((double)i/(double)maxrecords)*100

); worker.reportprogress(percent,

new keyvaluepair(i, guid.newguid().tostring()));

thread.sleep(

100);

}return

maxrecords;

}private

void backgroundworker1_progresschanged(object

sender, progresschangedeventargs e)

records retrieved!

", record.key);

this.progressbar1.value =e.progresspercentage;

this

.listview1.items.add(record.value);

}private

void backgroundworker1_runworkercompleted(object

sender, runworkercompletedeventargs e)

", e.result);

this.btnstart.enabled = true

;

this.btncancel.enabled = false

; }

catch

(targetinvocationexception ex)

}private

void btncancel_click(object

sender, eventargs e)

}}

C 跨執行緒呼叫控制項

在c 應用程式開發中,我們經常需要把ui執行緒和工作執行緒分開程式設計,為了防止介面停止響應。同時,我們也需要在工作執行緒中去更新ui介面的控制項,在clr的執行緒安全中並不允許我們直接在工作執行緒操作ui介面。因此,介紹以下三種方式進行跨執行緒操作ui。private void button2 c...

C 跨執行緒呼叫控制項

在c 的應用程式開發中,我們經常要把ui執行緒和工作執行緒分開,防止介面停止響應。同時我們又需要在工作執行緒中更新ui介面上的控制項,下面介紹幾種常用的方法 閱讀目錄 執行緒間操作無效 第一種辦法 禁止編譯器對跨執行緒訪問做檢查 第二種辦法 使用delegate和invoke來從其他執行緒中呼叫控制...

跨執行緒呼叫控制項之MethodInvoker

這是一部分重要的 用vs2005通過。使用到兩個控制項,乙個按鈕button1,乙個標籤label1。private void button1 click object sender,eventargs e private void myname private void hello 那裡不正確,一...