多线程的几个相关案例
多线程的几个相关案例
案例一:
代码:
public static void Test2() { for (int i = 0; i < 10; i++) { Task.Factory.StartNew(() => Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} ~ {i}")); } }
结果:
分析:
上述结果,可以看出我们预期是打印1~10,但实际的打印结果是上图,原因是这几个lambda表达式中使用了同一个变量,并且这些匿名函数共享变量值。
案例二:
代码:
public static void Test3() { Action<int> displayNumber = n => Console.WriteLine(n); int i = 5; Task taskOne = Task.Factory.StartNew(() => displayNumber(i)); i = 7; Task taskTwo = Task.Factory.StartNew(() => displayNumber(i)); Task.WaitAll(taskOne, taskTwo); }
结果:
分析:
当闭包通过lambda表达式捕获可变变量时,lambda捕获变量的引用,而不是捕获该变量的当前值。因此,如果任务在变量的引用值更改后运行,则该值将是内存中最新的值,而不是捕获变量时的值。
案例三:
代码:
public static void Test5() { Parallel.For(0, 10, n => Console.WriteLine($" {Thread.CurrentThread.ManagedThreadId} ~ {n}")); }
结果:
分析:
Parallel.For执行时无顺序的。
本文来自博客园,作者:码农阿亮,转载请注明原文链接:https://www.cnblogs.com/wml-it/p/14797079.html
技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
开源库地址,欢迎点亮:
GitHub:https://github.com/ITMingliang
Gitee: https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang
建群声明: 本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,为大家答疑解惑。热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!进群方式:扫码关注公众号,后台回复【进群】。