【问题标题】:Basic multithreading code not working as expected [duplicate]基本多线程代码未按预期工作[重复]
【发布时间】:2015-08-13 19:07:16
【问题描述】:

我是多线程新手,我使用非常简单的代码得到了意想不到的结果:

    public void Run()
    {
        for (int i = 0; i < 10; i++)
        {
            Thread t = new Thread(() => myFun((i + 1)));
            t.Start();
        }
    }

    private void myFun(int threadNo)
    {
        Console.WriteLine("Thread #" + threadNo.ToString());
    }

有人能解释一下为什么上面的代码会打印到控制台窗口吗?

线程#3

线程#3

线程#3

线程#6

线程#6

线程#8

线程#9

线程 #10

线程 #11

线程 #11

【问题讨论】:

  • 显然我希望 Thread#1 Thread#2 ... 3...4...5...6...7...8...9...10

标签: c# multithreading


【解决方案1】:

这是因为您使用的是 closes over the loop variable 的 lambda。

这样重构你的代码:

public void Run()
{
    for (int i = 0; i < 10; i++)
    {
        int j = i;
        Thread t = new Thread(() => myFun((j + 1)));
        t.Start();
    }
}

private void myFun(int threadNo)
{
    Console.WriteLine("Thread #" + threadNo.ToString());
}

并享受变化。

【讨论】:

    【解决方案2】:

    您可以像 Jesse 建议的那样在循环内使用“本地”变量,也可以使用参数化开始 (ParameterizedThreadStart):

    public void Run()
    {
        for (int i = 0; i < 10; i++)
        {
            Thread t = new Thread(myFun);
            t.Start(i + 1);
        }
    }
    
    private void myFun(object threadNo)
    {
        Console.WriteLine("Thread #" + threadNo.ToString());
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      相关资源
      最近更新 更多