在多线程C#应用程序中向方法传递字符串参数

在多线程C#应用程序中向方法传递字符串参数,c#,string,multithreading,C#,String,Multithreading,我有一个应用程序,它将一个字符串参数传递给一个方法,该方法使用循环中的一个线程调用,就像这样,这个线程被创建了50次 Thread t = new Thread(new ThreadStart(() => { StartExtraction( savedFileName); })); t.Name = "do"; t.Start(); 在StartExtraction方法中,我注意到参数被覆盖,我的意思是,如果第一次调用是使用savedFileName=“abc”,第二次调用是使

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

Thread t = new Thread(new ThreadStart(() =>
{
    StartExtraction( savedFileName);
}));
t.Name = "do";
t.Start();
StartExtraction方法中,我注意到参数被覆盖,我的意思是,如果第一次调用是使用savedFileName=“abc”,第二次调用是使用savedFileName=“xyz”,那么该方法总是处理“xyz”,我的意思是调试时,StartExtraction参数被覆盖,为什么

为什么?

因为这就是工作原理。它关闭变量,而不是值。如果更改
savedFileName
的值,您将在捕获的代理中看到该值

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

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

因为这就是工作原理。它关闭变量,而不是值。如果更改
savedFileName
的值,您将在捕获的代理中看到该值

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

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

因为这就是工作原理。它关闭变量,而不是值。如果更改
savedFileName
的值,您将在捕获的代理中看到该值

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

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

因为这就是工作原理。它关闭变量,而不是值。如果更改
savedFileName
的值,您将在捕获的代理中看到该值

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

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

除了已经回答的问题外,还需要将
savedFileName
的值存储到循环中的临时变量中,并使用该值而不是
savedFileName
,以避免关闭

例如,请参见此处已提供的答案:


除了已回答的问题外,还需要将
savedFileName
的值存储到循环中的临时变量中,并使用该值而不是
savedFileName
,以避免关闭

例如,请参见此处已提供的答案:


除了已回答的问题外,还需要将
savedFileName
的值存储到循环中的临时变量中,并使用该值而不是
savedFileName
,以避免关闭

例如,请参见此处已提供的答案:


除了已回答的问题外,还需要将
savedFileName
的值存储到循环中的临时变量中,并使用该值而不是
savedFileName
,以避免关闭

例如,请参见此处已提供的答案: