首页 > 编程语言 > 详细

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

时间:2020-11-14 15:03:58      阅读:24      评论:0      收藏:0      [点我收藏+]

示例代码:

        #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

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

原文:https://www.cnblogs.com/tomorrow0/p/13973148.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!