为了账号安全,请及时绑定邮箱和手机立即绑定

线程池将任务排队到队列后,竟丢失了该任务

线程池将任务排队到队列后,竟丢失了该任务

HUX布斯 2018-12-06 13:53:45
今天不小心发现一个问题一直不解。       当我在一个方法中使用ThreadPool.QueueUserWorkItem插入任务时,如果方法执行过快会导致我插入的任务实际上没有执行。而若我插入任务后让线程等待一下,那么插入的任务就可以正常执行。。见代码 static void Main(string[] args) { Example_RegisterWaitForSingleObject(); Console.ReadKey(); } private static void Example_RegisterWaitForSingleObject() { ThreadPool.QueueUserWorkItem(o => { while (true) { Thread.Sleep(500); Console.WriteLine("123"); } }); Thread.Sleep(1000); }   所以推断,将任务插入到线程池中是需要时间的,而若在这段时间中释放掉某些资源就会导致任务没有实际插入到队列中。 我的疑惑是: 1、到底我的推断整不正确。有没有更官方的解释,或则研究过win32的帮解释下 2、若实际代码中遇到这种情况大家都有什么好解决的办法(应该不会去Thread.Sleep()一下哇,最好有无阻塞式的方式)
查看完整描述

8 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

我想问一句,你把你代码中的 Thread.Sleep 都去掉的话,Console.WriteLine("123"); 就不会执行了吗?
查看完整回答
反对 回复 2018-12-09
?
隔江千里

TA贡献1906条经验 获得超10个赞

我按你的代码做了一下测试 private static void Example_RegisterWaitForSingleObject()        {            ThreadPool.QueueUserWorkItem(o => {                 while (true)                 {                     //Thread.Sleep(500);                     Console.WriteLine("123");                 }             });            //Thread.Sleep(1000);        } 正常输出,没有任何问题
查看完整回答
反对 回复 2018-12-09
?
四季花海

TA贡献1811条经验 获得超5个赞

@滴答的雨:  我在2010中试的正常,没有下2012
查看完整回答
反对 回复 2018-12-09
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

@滴答的雨:  你断点调试一下,看看是什么原因
查看完整回答
反对 回复 2018-12-09
?
长风秋雁

TA贡献1757条经验 获得超7个赞

@滴答的雨:  我觉得是你电脑反映太慢
查看完整回答
反对 回复 2018-12-09
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

@Rich.T: ……不会啊,我在家笔记本I5+4g内存+独显和我在公司core2+2G+独显,效果一样
查看完整回答
反对 回复 2018-12-09
  • 8 回答
  • 0 关注
  • 910 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信