c# - 基本多线程代码未按预期工作

标签 c# multithreading

<分区>

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

    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

最佳答案

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

重组你的代码:

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());
}

并享受改变。

关于c# - 基本多线程代码未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996494/

相关文章:

java - Guava ImmutableSet.copyOf() 线程安全吗?

c++ - 如何使异步并行程序代码易于管理(例如在 C++ 中)

multithreading - 在 TThread.Execute 中调用 TDataModule 方法

c# - 在 Azure 移动应用服务客户端中,如何设置 userId 以便 loginAsync 工作?

c# - JSON 有效,但代码中的结果返回 null

c# - 如何区分类型 : Int32[] & Int32[*]?

java - 如果同时有很多请求,多线程是否会提高性能?

c# - 当从右到左为真时背景图像不显示

c# - 调用带返回值的存储过程

c# - 如何使 NLog 在运行时线程安全地写入单独的文件目标?