难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?
时间:2022-04-22
本文章向大家介绍难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)的方式实现异步调用:
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: List<Action> actions = new List<Action>();
6: actions.Add(() => Console.WriteLine("A1"));
7: actions.Add(() => Console.WriteLine("A2"));
8: actions.Add(() => Console.WriteLine("A3"));
9: actions.Add(() => Console.WriteLine("A4"));
10:
11: foreach (var action in actions)
12: {
13: ThreadPool.QueueUserWorkItem(state => action(), null);
14: }
15:
16: Console.Read();
17: }
18: }
但是出现错误的输出结果:
解决的方案就是在每次For循环中,调用Thread.Sleep休眠当前线程,哪怕是1ms:
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: List<Action> actions = new List<Action>();
6: actions.Add(() => Console.WriteLine("A1"));
7: actions.Add(() => Console.WriteLine("A2"));
8: actions.Add(() => Console.WriteLine("A3"));
9: actions.Add(() => Console.WriteLine("A4"));
10:
11: foreach (var action in actions)
12: {
13: ThreadPool.QueueUserWorkItem(state => action(), null);
14:
15: Thread.Sleep(1);
16: }
17:
18: Console.Read();
19: }
20: }
21:
这次能够输出正确的结果:
我们也看到很多人确实是这么做的。但是如果真是必须这样的话,这样的编程方式很难让我接受,不知道大家有何高见。
在老赵的提示下,醒悟过来:由于被置于ThreadPool中的操作时异步的,还没有来的执行的时候,action已经被for循环改变,永远是同一个action对象! 呵呵,脑袋有时候有点转不过弯!
所以正确的写法是:
1: foreach (var action in actions)
2: {
3: var a = action;
4: ThreadPool.QueueUserWorkItem(state => a(), null);
5: }
- Table被web编程弃用的原因
- Web安全实战
- 【翻译】MongoDB指南/聚合——聚合管道
- PHP异步高并发扩展Swoole
- TensorFlow从0到1丨 第五篇:TensorFlow轻松搞定线性回归
- 【直播】我的基因组59:把我的数据伪装成23andme或wegene的芯片数据
- asp.net web api客户端调用
- 细说WebSocket - Node篇
- TensorFlow从0到1丨 第六篇:解锁梯度下降算法
- .Net多线程编程—误用点分析
- Web开发常见的几个漏洞解决方法
- .Net多线程编程—同步机制
- .Net多线程编程—Parallel LINQ、线程池
- 没有自己的服务器如何学习生物数据分析(下篇)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SpringBoot学习五:错误处理、跨域支持
- Spring Security安全
- SpringBoot定时任务
- MySQL优化以及索引的使用
- 前端表单提交String类型数据后端转日期数据
- Java - CentOS下JDK的安装与配置
- yum安装与配置 Tomcat
- org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, “xxxx“)] with root cause
- UnsatisfiedDependencyException
- Java8 Collectors.toMap的key重复
- bean无法注入(与文件包位置有关)及修改包项目、model名
- Jackson第一篇
- jackson第二篇
- 从源码分析常见集合的区别之List接口
- c++ 调用ffmpeg命令获取视频属性