线程池将任务排队到队列后,竟丢失了该任务
今天不小心发现一个问题一直不解。
当我在一个方法中使用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
我想问一句,你把你代码中的 Thread.Sleep 都去掉的话,Console.WriteLine("123"); 就不会执行了吗?
-
隔江千里
我按你的代码做了一下测试
private static void Example_RegisterWaitForSingleObject() { ThreadPool.QueueUserWorkItem(o => { while (true) { //Thread.Sleep(500); Console.WriteLine("123"); } }); //Thread.Sleep(1000); }
正常输出,没有任何问题
-
四季花海
@滴答的雨:
我在2010中试的正常,没有下2012
-
海绵宝宝撒
@滴答的雨:
你断点调试一下,看看是什么原因
-
长风秋雁
@滴答的雨:
我觉得是你电脑反映太慢
-
犯罪嫌疑人X
@Rich.T: ……不会啊,我在家笔记本I5+4g内存+独显和我在公司core2+2G+独显,效果一样