我有一些应用程序将字符串参数传递给一个方法,该方法使用这样的循环中的线程调用,这个线程创建50次
Thread t = new Thread(new ThreadStart(() =>
{
StartExtraction( savedFileName);
}));
t.Name = "do";
t.Start();
在 StartExtraction 方法中我注意到参数被覆盖了,我的意思是如果第一次调用是使用savedFileName =“abc”而第二次是使用savedFilename =“ xyz“,方法总是处理”xyz“,我的意思是调试后的StartExtraction,参数被覆盖,为什么?
答案 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
来避免关闭。
作为示例,请参阅此处已提供的答案: