多线程的几个相关案例
案例一:
代码:
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执行时无顺序的。