当前位置: 首页 > article >正文

C#——多线程之异步调用容易出现的问题

C#——多线程之异步调用容易出现的问题

  • Q1:For中异步调用函数且函数输入具有实时性


Q1:For中异步调用函数且函数输入具有实时性

在项目进行过程中,发现For中用异步调用带有输入参数的函数时,会由于闭包特性,以及Task.Run的计划启动特性,导致输入会出现问题。
问题代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                Task.Run(() =>
                {
                    writeSth(i);
                });  
            }
            Console.ReadKey();
        }

        public static void writeSth(int index) 
        {
            Console.WriteLine(index);
        }
    }

测试结果如下:
在这里插入图片描述
可以很明显的看出,由于异步启动存在延时,for又会因为异步task而不停的循环导致i的迅速递增。而当任务启动函数时,i并不是想要实现的数(理想的0-99打印)。

解决方案:
导致这一现象的原因是For的闭包特性,所以在调用前进行值的拷贝就可以了。代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                int index = i;
                Task.Run(() =>
                {
                    writeSth(index);
                });  
            }
            Console.ReadKey();
        }

        public static void writeSth(int index) 
        {
            Console.WriteLine(index);
        }
    }

测试结果如下:
在这里插入图片描述
PS:可以看出,Task.Run的执行是无序的,并不按照生成的先后执行。


http://www.kler.cn/a/147279.html

相关文章:

  • vuex和pinia的区别
  • Python3.11.9+selenium,选择证书用多线程+键盘enter解决
  • 【Oracle篇】掌握SQL Tuning Advisor优化工具:从工具使用到SQL优化的全方位指南(第六篇,总共七篇)
  • 推荐15个2024最新精选wordpress模板
  • 图形几何之美系列:二维凸包艺术赏析
  • 【CV】头盔检测区域入侵项目
  • Go语言初始化已有环境,跟踪已有依赖环境
  • Android设计模式--桥接模式
  • 数据可视化:在Jupyter中使用Matplotlib绘制常用图表
  • Echarts大屏可视化_02 球体模块制作
  • kafka的详细安装部署
  • Vue路由跳转页面刷新
  • 87基于matlab的双卡尔曼滤波算法
  • java游戏制作-王者荣耀游戏
  • linux环境下samba服务器的配置
  • MYSQL 排序和分组怎么做?
  • ChatGLM2-6B微调过程说明文档
  • C语言基础篇5:指针(二)
  • C#,《小白学程序》第三课:类class,类的数组及类数组的排序
  • 在Spring Boot中使用@Async异步任务的线程池
  • Selenium 连接到现有的 Firefox 示例
  • C语言--每日选择题--Day27
  • buuctf web [极客大挑战 2019]PHP
  • app分发平台应用费用一般要怎么评估的?
  • diffusion model (九) EmuEdit技术小结
  • Docker-简介、基本操作