C# 我可以为不同的BackgroundWorker线程重用相同的变量名吗?

C# 我可以为不同的BackgroundWorker线程重用相同的变量名吗?,c#,multithreading,C#,Multithreading,样本编码如下: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { string var1 = "sample 1"; //display in UI var1 string var1 = "sample 1.1"; //display in UI var1 } private void backgroundWorker2_DoWork(object sender, DoWorkEv

样本编码如下:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
  string var1 = "sample 1";
  //display in UI var1
  string var1 = "sample 1.1";
  //display in UI var1
}

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
  string var1 = "sample 2";
  //display in UI var1
  string var1 = "sample 2.1";
  //display in UI var1
}

private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
  string var1 = "sample 3";
  //display in UI var1
  string var1 = "sample 3.1";
  //display in UI var1
}
它会因为线程使用相同的变量而导致线程速度减慢吗?或者它会导致错误的值显示在UI上,因为值总是在变化吗?我的程序将有很多线程,因此我担心可能会出现不可预见的后果。

这些线程是独立存在的,编译器和运行时永远不会混淆它们,因为它们是。。。他们被宣布的地方。事实上,局部变量与线程无关,请参见[*]

一旦编译,局部变量的名称将丢失(它们将是-相当于说-
局部变量1
局部变量2
,等等)。也就是说,在Microsoft中间语言中,局部变量的名称是不相关的。看

它会因为线程使用相同的变量而导致线程速度减慢吗

不,这些都是毫无根据的担忧。这些局部变量彼此无关

或者它会导致错误的值显示在UI上,因为值总是在变化吗

无论变量名如何,都可能发生这种情况。重要的是您在UI中显示了什么价值,以及何时何地显示它。持有它的变量的名称没有影响

我的程序将有很多线程,所以我担心潜在的不可预见的后果

不要担心局部变量。一旦我们开始讨论线程间某种形式的共享内存,那么您就有理由担心了。不,局部变量不是跨线程共享的,让我在这里澄清一下:它们是局部的[**]

我想推荐约瑟夫·阿尔巴哈里的系列。尽管已经过时,[***]但是写得很好,有明确的例子,并且能够理解所有的基本原理


尽管如此,命名变量对于代码的可读性和可维护性非常重要。无论如何,我没有心情说教。所以,你做你自己。关于这个问题,我只想说:下次当你看到一个变量,你不确定它是什么,或者你可能在哪里使用它时,想想它


[*]:本文提到了暴露局部变量的两种方式。这两种方法都相当于将局部变量升级到幕后的一个非ymous对象字段(
yield return
将值复制到一个隐藏的
IEnumerator
,另一方面,如果在局部变量上生成一个值并共享它,则在一个隐藏的匿名类中共享局部变量)

[**]:即使您正在使用并且该方法已在另一个线程中恢复,两个线程也不可能共享局部变量(它已易手,但您通常没有理由担心,除非您正在使用或类似)


[***]:现在我们将使用
async/await
,事实上,您为什么要使用
BackgroundWorker

在什么意义上它们使用相同的变量?什么样的价值正在改变?不清楚你在问什么。您显示的每个线程都有一个本地字符串变量,该变量目前未在其他任何地方使用。对不起,我的错误。我已经编辑了代码,恐怕还不清楚,因为在您显示的代码中,显然没有任何东西可以减慢线程的速度,只要您使用invoke从主线程更新控件,您应该可以。@mnistic我是多线程新手,所以我不确定线程是否必须轮流访问同名变量,从而降低整个UI的速度。我只是想知道不同的线程是否引用相同的引用变量。Theraot的回答澄清了我的误解。好吧,我从这里得到了一些建议,尝试使用BackgroundWorker来处理多线程。BackgroundWorker有什么问题吗?谢谢。我想你的回答澄清了我的疑问doubts@user107257
BackgroundWorker
工作。利基用例位于UI中,这是它的预期用途。在上,它很旧,
async/await
当时不存在
async/await
是未来的建议,尽管这并不意味着你已经摆脱了
BackgroundWorker
(你甚至可以混合使用它们)。另请参阅。非常感谢您的建议。我将记住async/Wait,以备将来的项目使用。