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