2016-02-23 48 views
0

我打電話使用參數化的螺紋參數化線程不保持該方法

ParameterizedThreadStart ts = delegate(object o) { ProcessDBThread(strDBName, dicMsg, objQueueItem.RunID); }; 

因此,TS變量應該邏輯地包含所有3個參數,我傳遞函數的所有參數,但它僅保持一個參數。

上面的代碼是在一個循環內,因此剩下的兩個參數被最新的值覆蓋。結果所有參數化線程包含不同的dicMsg,但是相同的strDBName。實際上,strDBName對於每種情況都不相同。

我已經在快速監視中檢查了ts值; ((System.Delegate)(ts)).Target 這裏的Target只包含一個參數,它應該是三個參數。

只是指出我哪裏可能出錯了!

+0

如果你向我們展示了所有的代碼,那將會非常棒。 [mcve]對我們來說價值百萬美元。 – Enigmativity

+0

我瞭解你的觀點,但我無法發佈整個代碼,因爲它相當冗長,不可讀。反正你的答案工作正常。 –

+0

這不是一個觀點,它是Stack Overflow的一個很好的問題。你應該閱讀[問]和[mcve]。 – Enigmativity

回答

1

試試這個您的循環中:

var dbn = strDBName; 
var msg = dicMsg; 
var rid = objQueueItem.RunID; 
ParameterizedThreadStart ts = delegate (object o) 
{ 
    ProcessDBThread(dbn, msg, rid); 
}; 

當你有這樣的代碼:

for (var i = 0; i < 10; i++) 
{ 
    ParameterizedThreadStart ts = delegate (object o) { Console.WriteLine(i); }; 
    ts.Invoke(null); 
} 

...它需要啓動線程的時間遠遠長於請執行for循環完成,以便線程委託中的值i在任何線程啓動之前變爲10。因此,通過這樣

for (var i = 0; i < 10; i++) 
{ 
    var j = i; 
    ParameterizedThreadStart ts = delegate (object o) { Console.WriteLine(j); }; 
    ts.Invoke(null); 
} 

...您捕獲的i副本中j並不會改變(因爲它是循環的範圍內),這樣的參數正常工作。

+0

它的工作,但我更傾向於知道做這個調整的需要? –

+0

@Abhijit_Srikumar您正在運行[變量捕獲](http://stackoverflow.com/questions/5438307/detailed-explanation-of-variable-capture-in-closures)問題。 –

+0

@Abhijit_Srikumar - 我添加了一個解釋。如果你提供了完整的代碼,我會首先給出這個解釋。 – Enigmativity