将字符串参数传递给多线程C#应用程序

时间:2015-10-08 11:56:05

标签: c# string multithreading

我有一些应用程序将字符串参数传递给一个方法,该方法使用这样的循环中的线程调用,这个线程创建50次

Thread t = new Thread(new ThreadStart(() =>
{
    StartExtraction( savedFileName);
}));
t.Name = "do";
t.Start();

StartExtraction 方法中我注意到参数被覆盖了,我的意思是如果第一次调用是使用savedFileName =“abc”而第二次是使用savedFilename =“ xyz“,方法总是处理”xyz“,我的意思是调试后的StartExtraction,参数被覆盖,为什么?

2 个答案:

答案 0 :(得分:2)

  

为什么?

因为这就是closure的工作原理。它会关闭变量,而不是值。如果您更改savedFileName的值,那么您将在捕获的委托中看到这一点。

为了设置预期值,您需要将其存储在捕获的lambda中的局部变量中:

Thread t = new Thread(new ThreadStart(() =>
{
    var temp = savedFileName;
    StartExtraction(temp);
}));
t.Name = "do";
t.Start();

答案 1 :(得分:1)

添加已经回答的内容,您需要将setDT(data)[, x := Reduce(function(...) paste(..., sep = "-"), .SD), .SDcols = cols] 的值存储到循环中的临时变量中,并使用它而不是savedFileName来避免关闭。

作为示例,请参阅此处已提供的答案:

Captured variable in a loop in C#