2010-04-15 77 views
1

我如何將一些參數傳遞給從另一個類運行函數的新線程? 我想要做的是將一個數組或多個變量傳遞給一個函數,該函數位於另一個類中,並由新線程調用。C#4.0如何將變量傳遞給線程?

我試圖做這樣的>

Functions functions = new Functions(); 

    string[] data; 

    Thread th = new Thread(new ParameterizedThreadStart(functions.Post())); 

    th.Start(data); 

,但它顯示錯誤「沒有超載的方法‘郵報’取0參數」

任何想法?

+0

請注意,你的代碼真正的問題是,你所呼叫的郵政法代替將它傳遞給委託構造函數。你應該省略functions.Post()之後的括號,並且這將被編譯。 – Marek 2010-04-20 09:06:39

回答

9

既然你有這個標記C#4,新方法,這將是:

Functions functions = new Functions(); 

string[] data = GetData(); 

Task.Factory.StartNew(() => functions.Post(data)); 

如果你真的想離開這個使用專用線程,而不是任務並行庫,能夠。鑑於您的意見,這聽起來像Post()可能定義爲Post(string[] data)。這是行不通的,因爲ParameterizedThreadStart預計方法是Post(object data)

您可以解決此通過lambda表達式,並使用ThreadStart代替ParameterizedThreadStart,然而,在不改變你的方法:

Functions functions = new Functions(); 
string[] data = GetData(); 
Thread th = new Thread(() => 
    { 
     functions.Post(data); 
    }); 
th.Start(); 
2

直接的回答是:

new Thread(new ParameterizedThreadStart(functions.Post/*(remove)*/)); 

和Functions.Post應該是這樣的形式:

void Post(object state) { string[] data = (string[]) state; .... } 

如果你已經有了一個固定的void Post(string[] data)你可以添加一個包裝的功能類:

void Post2(object state) { Post((string[]) state); } 

但是,當使用Fx4你應該看看任務l ibrary。

+0

現在我得到「沒有過載'發佈'匹配委託'System.Threading.ParameterizedThreadStart'」 – Aviatrix 2010-04-15 22:21:41

+1

@Aviatrix:你可以發佈你的代碼(或至少sig.)的functions.Post()? – 2010-04-15 22:22:30

+0

@Aviatrix,我還在編輯一點,也許最後的版本有所幫助。但我在這裏與裏德,請張貼輪廓。 – 2010-04-15 22:24:05