WinForm 多執行緒

2021-09-08 16:23:48 字數 2074 閱讀 5917

-. winform多執行緒程式設計

1. new thread()

新開乙個執行緒,執行乙個方法,沒有引數傳遞:

private

void

dowork() 

private

void

dosomething() 

新開乙個執行緒,執行乙個方法,並傳遞引數:

private void dowork()

private void dosomething(object o)

引數定義為object型別。

2. threadpool

眾所周知,新開乙個執行緒代價是很高昂的,如果我們每個操作都新開乙個執行緒,那麼太浪費了,於是,下面使用執行緒池。

無引數傳遞:

private void

dowork() 

private

void

dosomething(

object

o) 有引數傳遞:

private void

dowork() 

private

void

dosomething(

object

o) 

使用匿名方法更靈活:

private void

dowork() 

));}

在匿名**段裡面可以直接訪問區域性變數,不用在關心引數傳遞的問題

2.invoke方法簽名:

object control.invoke(delegate method)

object control.invoke(delegate method, params object args)

3.使用自定義委託

private void

dowork() 

private

delegate

void

myinvokedelegate(

string

name);

private void

dosomething(

object

o) private

void

changetext(

string

name) 

4.使用system.action:

private void

dowork() 

private

void

dosomething(

object

o) private

void

changetext(

string

name) 

本例傳遞乙個引數,system.action有很多個過載,可以無引數(非泛型),而最多可以有四個引數,同樣採用匿名方法,不使用泛型形式的system.action,如下:

private void

dowork() 

private

void

dosomething(

object

o) ));}

5.使用system.func

如果invoke呼叫主窗體操作之後,還希望在呼叫完得到乙個返回值:

private void

dowork() 

private

void

dosomething(

object

o) private

intgetid(

string

name) 

else

}result的值為 999。

system.func同樣有很多泛形過載,這裡不贅述。

6.關於invoke的擁有者:control

本文例中都是用this來引用,這裡this替換為窗體任何乙個控制項的控制代碼都是ok的,因為control.invoke含義是將方法委託給擁有該control的執行緒去執行。

winform 多執行緒錯誤集錦

1.thread.sleep 300 到底睡的是誰,哪個執行緒?1 public void setlabelinfo object num 2 7 8else920 21 累加顯示到label 中,第一次確實是btn發起的執行緒,name start clic 程,第二次顯示的主線程,所以threa...

WinForm多執行緒程式設計簡單Demo

ps 由於報告生成非常耗費資源,使用單執行緒程式設計模式,監控資訊根本無法資訊無法及時在richtext顯示.public partial class form1 form private void createrpt cancellationtoken ct invoke方法用於獲得建立lbl s...

C 的WinForm多執行緒應用

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