帶引數的多執行緒的方式

2021-06-27 06:34:53 字數 4516 閱讀 3349

#region 執行帶乙個引數的多執行緒thread mythread = new thread(new

parameterizedthreadstart(calculate));

mythread.isbackground = true

;

mythread.start(

500);

#endregion

private

void calculate(object max) //

帶乙個引數的委託函式

stopwatch.stop();

long lsearchtime =stopwatch.elapsedmilliseconds;

messagebox.show(lsearchtime.tostring() + "毫秒"

); }

方式一: 定義乙個類,將要傳的引數設定為類的屬性,然後將引數值賦值給類的屬性,將類作為乙個引數進行傳達,以下**通過兩個引數示例,多個引數一樣,**如下

class

myclass

public

int min

}#region 第一種方式:執行帶多個引數的多執行緒myclass model = new

myclass();

model.max = 500

; model.min = 0

; thread mythread1 = new thread(new

parameterizedthreadstart(calculatetwo));

mythread1.isbackground = true

;

mythread1.start(model);

#endregion

private

void calculatetwo(object myclass) //

帶多個引數的委託函式

stopwatch.stop();

long lsearchtime =stopwatch.elapsedmilliseconds;

messagebox.show(lsearchtime.tostring() + "毫秒"

); }

方式二:lambda表示式的方式,簡單方便,**如下:

#region 第二種方式:執行帶多個引數的多執行緒thread mythread2 = new thread(() => calculatethree(500, 0

)); mythread2.isbackground = true; //

設定為後台執行緒,程式關閉後程序也關閉,如果不設定true,則程式關閉,此執行緒還在記憶體,不會關閉

mythread2.start();

#endregion

private

void calculatethree(int max,int min) //

帶多個引數的委託函式

stopwatch.stop();

long lsearchtime =stopwatch.elapsedmilliseconds;

messagebox.show(lsearchtime.tostring() + "毫秒"

); }

在 .net framework 2.0 版中,要實現執行緒呼叫帶引數的方法有兩種辦法。

第一種:使用parameterizedthreadstart。

呼叫 system.threading.thread.start(system.object) 過載方法時將包含資料的物件傳遞給執行緒。

使用 parameterizedthreadstart 委託不是傳遞資料的型別安全的方法,因為 system.threading.thread.start(system.object) 方法過載接受任何物件。

這種方法不推薦使用,故在此不做詳細介紹,具體用法參見:

複製**

parameterizedthreadstart parstart = new parameterizedthreadstart(threadmethod);

thread mythread = new thread(parstart);

object o = "hello";

mythread.start(o);

//threadmethod如下:

public void threadmethod(object parobject)

複製**

第二種:將執行緒執行的方法和引數都封裝到乙個類裡面。通過例項化該類,方法就可以呼叫屬性來實現間接的型別安全地傳遞引數。

具體**如下(本示例來自msdn)

複製**

using system;

using system.threading;

//threadwithstate 類裡包含了將要執行的任務以及執行任務的方法

public class threadwithstate

//要丟給執行緒執行的方法,本處無返回型別就是為了能讓threadstart來呼叫

public void threadproc()

}//用來呼叫上面方法的類,是本例執行的入口

public class example .", 42);

// 建立執行任務的執行緒,並執行

thread t = new thread(new threadstart(tws.threadproc));

t.start();

console.writeline("main thread does some work, then waits.");

t.join();

console.writeline(

"independent task has completed; main thread ends.");  }}

複製**

方法一:

在vs2003中,也不能直接訪問,參看 

一般來說,直接在子執行緒中對窗體上的控制項操作是會出現異常,這是由於子執行緒和執行窗體的執行緒是不同的空間,因此想要在子執行緒來操作窗體上的控制項,是不可能 簡單的通過控制項物件名來操作,但不是說不能進行操作,微軟提供了invoke的方法,其作用就是讓子執行緒告訴窗體執行緒來完成相應的控制項操作。 

現在用乙個用執行緒控制的程序條來說明,大致的步驟如下: 

1.建立invoke函式,大致如下: 

///

/// delegate function be invoked by main thread 

///

private     void     invokefun() 

2.子執行緒入口函式: 

///

/// thread function inte***ce 

///

private void threadfun()    }

3.建立子執行緒: 

thread thdprocess = new thread(new threadstart(threadfun)); 

thdprocess.start(); 

備註: 

using system.threading; 

private system.windows.forms.progressbar prgbar; 

方法二:

加入該句:control.checkforillegalcrossthreadcalls = false    取消線執行緒安全保護模式!

方法三:帶引數

使用類、類的方法或類的屬性都可以向執行緒傳遞引數:

public class url**********

public void download()

}[... 在另乙個類中使用它們...]

url********** ********** = new url********** (yoururl);

new thread (new threadstart (**********.download)).start();

注意引數是如何傳遞的。

方法四:帶引數

threadstart starter = delegate ;

new thread(starter).start();

//使用執行緒池

waitcallback callback = delegate (object state) ;

threadpool.queueuserworkitem (callback, yoururl);

方法五:帶引數

thread t = new thread (new parameterizedthreadstart(downloadurl));

t.start (myurl);

static void downloadurl(object url)



帶引數的多執行緒的方式

region 執行帶乙個引數的多執行緒thread mythread new thread new parameterizedthreadstart calculate mythread.isbackground true mythread.start 500 endregion private v...

帶引數的多執行緒的方式

通常會有需求通過多執行緒呼叫帶引數的委託函式,有乙個引數的,也有多個引數的,下面來講講實現的方式 region 執行帶乙個引數的多執行緒thread mythread new thread new parameterizedthreadstart calculate mythread.isbackg...

帶引數的多執行緒如何去寫?

帶引數的多執行緒的方式 region 執行帶乙個引數的多執行緒 thread mythread new thread new parameterizedthreadstart calculate mythread.isbackground true mythread.start 500 endreg...