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

本文关键字:字符串 参数 方法 多线程 应用程序 | 更新日期: 2023-09-27 18:16:34

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

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

StartExtraction方法我注意到参数被覆盖,我的意思是如果第一次调用是savedFileName="abc",第二次是savedFileName="xyz",该方法总是处理"xyz",我的意思是StartExtraction调试时,参数被覆盖,,为什么?

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

为什么?

因为这就是闭包的工作方式。它关闭的是变量,而不是值。如果你改变了savedFileName的值,这就是你将在捕获的委托中看到的内容。

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

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

加上已经回答的内容,您需要将savedFileName的值存储到循环中的临时变量中,并使用该值代替savedFileName,以避免闭包。

作为一个例子,请看这里已经提供的答案:

c#中循环中捕获的变量