参数化线程不保存方法的所有参数

时间:2016-02-23 13:19:19

标签: c# multithreading

我正在使用参数化线程

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

因此,ts变量应逻辑上包含我传递的所有3个参数,但它只包含一个参数。

上面的代码在循环中,因此其余两个参数被最新值覆盖。因此,所有参数化线程包含不同的dicMsg但相同的strDBName。实际上strDBName对于每种情况都不同。

我已经快速观察了ts值; ((System.Delegate)(ts)).Target 这里Target只包含一个参数,它应该是三个参数。

请指出我可能出错的地方!!

1 个答案:

答案 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的副本并且不会更改(因为它位于循环的范围内),因此参数可以正常工作。