我一直在研究“线程和任务”(.net 4),并注意到当您启动多个线程而没有在每个线程开始调用之间等待几毫秒的情况下,会出现一些奇怪的行为。

下面的示例在运行时不会输出我期望的结果:

1
2
1
2

但是只能输出:
2
2
2
2

下面是我正在运行的代码。
public static void Main()
{
    var items = new[] {"1", "2"};
    foreach (var item in items)
    {
      var thread = new Thread(() => Print(item));
      thread.Start();
      //var task = Task.Factory.StartNew(() => Print(item));
    }
}

static void Print(string something)
{
  while (true)
  {
    Console.WriteLine(something);
    Thread.Sleep(1000);
  }
}

现在,当我在thread.Start()之后调用Thread.Sleep(50)时,输出只会看起来像预期的那样
1
2
1
2

我的问题是:
  • 为什么当您不等待启动两个线程之间时,第一个
    线程松散了您最初使用它的方法的参数值?

  • 即第一个线程使用参数“1”启动,第二个线程使用参数“2”启动,但是第一个线程的参数也变为“2”?这毫无意义,尤其是因为Print()方法参数是字符串的值类型。

    最佳答案

    谷歌“获得修改后的关闭”。发生的情况是您的局部变量“item”在调用Print函数之前获取了其值的更改。一种解决方案是在循环范围内创建一个新变量,然后为其分配项目。

    关于c# - 启动多个线程,为什么必须等待?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7966572/

    10-11 03:01
    查看更多