C# 线程使用Lambda表达式给线程执行方法传参有变量共享的问题(即闭包问题)

示例代码:

        #region Lambda表达式传参导致线程参数共享问题
        public static void ThreadLambdaPara()
        {
            for(int i = 1; i <= 5; i++)
            {
                new Thread(() => ThreadMethod(i)).Start();
            }
        }
        #endregion

        #region 线程执行方法
        public static void ThreadMethod(int p)
        {
            Console.WriteLine(p);
        }
        #endregion

执行结果:

第一次我以为会输出结果是 1 2 3 4 5 ,但实际的输出是

 

 原因:使用lambda表达式引用另一个C#对象(本例中是外部循环里的变量i)的方式被称为闭包,当在lambda表达式使用任何外部的局部变量时,C#会生成一个类,并将该变量作为该类的一个属性;

解决方法:

使用临时变量替代共享变量i

 

 运行结果:

 

 

闭包参考

https://www.cnblogs.com/jiejie_peng/p/3701070.html

posted @ 2020-11-14 14:19  温故纳新  阅读(636)  评论(0编辑  收藏  举报