我正在使用参数化线程
调用函数ParameterizedThreadStart ts = delegate(object o) { ProcessDBThread(strDBName, dicMsg, objQueueItem.RunID); };
因此,ts变量应逻辑上包含我传递的所有3个参数,但它只包含一个参数。
上面的代码在循环中,因此其余两个参数被最新值覆盖。因此,所有参数化线程包含不同的dicMsg
但相同的strDBName
。实际上strDBName
对于每种情况都不同。
我已经快速观察了ts值; ((System.Delegate)(ts)).Target
这里Target
只包含一个参数,它应该是三个参数。
请指出我可能出错的地方!!
答案 0 :(得分: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
的副本并且不会更改(因为它位于循环的范围内),因此参数可以正常工作。