有乙個函式,它的功能就是載入資料,然後繫結到datagridview。現在開啟乙個執行緒去執行這個函式。結果可想而知,它會報錯:提示執行緒無法訪問。。。之類的話。為什麼報錯呢?因為你在開啟的執行緒中操作了datagridview控制項,也就是跨執行緒呼叫控制項了。 那麼我們應該怎麼跨執行緒呼叫控制項呢?跨執行緒呼叫控制項的幾種方法。
usingsystem;
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的方式。(也叫**方式)
usingsystem;
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 事件與使用者介面進行通訊。
usingsystem;
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 那裡不正確,一...