2010-07-29 77 views
226

如何在C#中將參數傳遞給Thread.ThreadStart()方法?如何將參數傳遞給Thread中的ThreadStart方法?

假設我有方法稱爲 '下載'

public void download(string filename) 
{ 
    // download code 
} 

現在我已經創建了一個線程在main方法:

Thread thread = new Thread(new ThreadStart(download(filename)); 

錯誤方法類型的預期。

如何使用帶參數的目標方法將參數傳遞給ThreadStart

+2

退房[這](HTTP://www.yoda.arachsys。com/csharp/threads /)由Jon Skeet編寫的文章參數部分在下一頁,但文章作爲一個整體是一個很好的閱讀。 – codingbadger 2010-07-29 08:18:22

回答

570

最簡單的就是

string filename = ... 
Thread thread = new Thread(() => download(filename)); 
thread.Start(); 

這樣做的好處(S)(超過ParameterizedThreadStart)是可以傳遞多個參數,你會得到編譯時檢查,而無需從object施放的所有時間。

+14

對於offtopic,我很抱歉,但'()'運算符意味着什麼?我有時看到它,但我沒有時間檢查。 – 2010-07-29 08:25:02

+21

這是一個沒有參數的lambda表達式。 – Noldorin 2010-07-29 08:27:36

+29

@ŁukaszW.pl - Noldorin說的;在C#2.0中的一個替代構造(對於這個例子)是'new Thread(delegate(){download(filename);});' – 2010-07-29 08:29:32

20

您想要將ParameterizedThreadStart委託用於帶參數的線程方法。 (或者根本不實際,並讓Thread構造推斷。)

用法示例:

var thread = new Thread(new ParameterizedThreadStart(download)); 
//var thread = new Thread(download); // equivalent 

thread.Start(filename) 
28

請看下面的例子:

public void RunWorker() 
{ 
    Thread newThread = new Thread(WorkerMethod); 
    newThread.Start(ParameterObject); 
} 

public void WorkerMethod(object parameterObject) 
{ 
    // do your job! 
} 

你是第一個通過傳遞委託創建線程到worker方法,然後用一個Thread.Start方法啓動它,該方法將您的對象作爲參數。

所以你的情況,你應該使用這樣的:

Thread thread = new Thread(download); 
    thread .Start(filename); 

但你的「下載」方法仍然需要採取對象,不作爲參數。您可以將它強制轉換爲方法體中的字符串。

+3

這真的有用嗎? – Mukus 2013-04-24 22:41:46

+1

不在我的嘗試中。 – 2013-05-02 21:25:44

4

你也可以delegate是這樣的...

ThreadStart ts = delegate 
{ 
     bool moreWork = DoWork("param1", "param2", "param3"); 
     if (moreWork) 
     { 
      DoMoreWork("param1", "param2"); 
     } 
}; 
new Thread(ts).Start(); 
0

如何:(?還是確定使用這樣)

var test = "Hello"; 
new Thread(new ThreadStart(() => 
{ 
    try 
    { 
     //Staff to do 
     Console.WriteLine(test); 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
})).Start(); 
2

您可以封裝線程功能(下載)和類中所需的參數(文件名),並使用ThreadStart委託來執行線程函數。

public class Download 
{ 
    string _filename; 

    Download(string filename) 
    { 
     _filename = filename; 
    } 

    public void download(string filename) 
    { 
     //download code 
    } 
} 

Download = new Download(filename); 
Thread thread = new Thread(new ThreadStart(Download.download); 
+0

我更喜歡這種方法,我發現lambda表達式並不總是跟蹤正確的參數 – meanbunny 2018-01-01 20:33:40

0

這裏是最完美的方式...

private void func_trd(String sender) 
{ 

    try 
    { 
     imgh.LoadImages_R_Randomiz(this, "01", groupBox, randomizerB.Value); // normal code 

     ThreadStart ts = delegate 
     { 
      ExecuteInForeground(sender); 
     }; 

     Thread nt = new Thread(ts); 
     nt.IsBackground = true; 

     nt.Start(); 

    } 
    catch (Exception) 
    { 

    } 
} 

private void ExecuteInForeground(string name) 
{ 
    //whatever ur function 
    MessageBox.Show(name); 
} 
1

在其他

Thread thread = new Thread(delegate() { download(i); }); 
    thread.Start();