首页 > 编程语言 > 详细

多线程的几个相关案例

时间:2021-05-21 22:20:51      阅读:28      评论:0      收藏:0      [点我收藏+]

多线程的几个相关案例

案例一:

代码:

  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

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