2012-02-04 73 views
2

可能重複:
thread with multiple parameters使用兩個參數對子進行線程化?

怎樣一個線程子有兩個參數?

我想擰我的子像這樣,但它的未來與錯誤:

Thread t = new Thread (subname); 
t.Start() 

下面是錯誤:

參數1:無法從「方法組」轉換爲 「 System.Threading.ParameterizedThreadStart'

最好的重載方法匹配 'System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)' 有一些無效參數

這裏是我的個子看起來如何:

public string send2(string kom, string ddm) 
     { 

///code for a httpwebrequest (too long to post all of it) 


} 

難道你們有什麼辦法呢?

+0

你期望你的子被調用什麼參數值?這根本不符合邏輯。 – usr 2012-02-04 17:06:26

回答

5

您可以使用lambda:

​​
+0

因此,如果在webrequest中聲明或指定字符串kom和ddm,我可以讓它們爲null,因此當線程啓動時它們將不再爲null? – user1017524 2012-02-04 17:08:14

+0

正如我在我的回答中所解釋的,我擔心線程在開始線程後立即被修改的情況下的線程安全問題。 – Tudor 2012-02-04 18:04:41

1

有點晚了,但我想指出你注意以下情況:

... 
string kom = ... 
string ddm = ... 

Thread t = new Thread(() => send2(kom, ddm)); 

t.start(); 
// the strings get assigned different values 
kom = ... 
ddm = ... 

它可能不是你的情況,但可能會發生,所以最好意識到這一點。

如果兩個字符串得到t之前分配不同的值有機會下手,那麼方法send2將得到的字符串和不是線程創建時所具有的數值的新值。

在這種情況下,它是一個更好的主意字符串複製一個包裝對象中並傳遞給線程的參數:

Wrapper w = new Wrapper(); // contains two strings 
w.String1 = String.Copy(kom); 
w.String2 = String.Copy(ddm); 

Thread t = new Thread( 
    o => 
    { 
     Wrapper lw = (Wrapper)o; 
     send2(lw.String1, lw.String2)); 
    }); 

t.start(w); 
// the strings get assigned different values 
kom = ... 
ddm = ... 

現在你是真正安全的,因爲琴絃得到了複製並傳遞給線程,所以後續的修改不會影響線程的執行。