在多线程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调试时,参数被覆盖,,为什么?
为什么?
因为这就是闭包的工作方式。它关闭的是变量,而不是值。如果你改变了savedFileName
的值,这就是你将在捕获的委托中看到的内容。
为了设置预期的值,您需要将其存储在捕获的lambda中的一个局部变量中:
Thread t = new Thread(new ThreadStart(() =>
{
var temp = savedFileName;
StartExtraction(temp);
}));
t.Name = "do";
t.Start();
加上已经回答的内容,您需要将savedFileName
的值存储到循环中的临时变量中,并使用该值代替savedFileName
,以避免闭包。
作为一个例子,请看这里已经提供的答案:
c#中循环中捕获的变量