2008年5月24日

最近Michael C. Kennedy在它的博客上写了一些关于.Net 2.0 SP1中ThreadPool的文章。

.NET 3.5 Brings Breaking Changes to ThreadPool中他介绍了一个对他影响很大的变化,新的.NET 2.0 SP1(随.NET 3.5 发布)忽略了ThreadPool.SetMinThreads导致他的程序停止运行。如果你的应用需要立即使用大量的线程池线程时,你必须通过ThreadPool.SetMinThreads提高最小线程数量,否则ThreadPool会尽快在线程池中分配最少数量的线程,接着每秒钟创建最多2个线程,直到达到最大线程数量的方法启动线程,它可能需要几秒钟才能完成。在文章中Michael给出了100个线程的测试示例,并在2008年2月26日提供了视频和相应的新的测试代码

另外Michael发现当太多线程等待其他任务结束时就会出现死锁,他通过向Vance Morrison(a .NET Runtime Performance Architect at Microsoft)确认那是一个Bug,他们将在.Net 2.0 SP2中修复。并且Vance给了Michael一个解决这个问题的策略,如下:

Take this "broken" code:
private static void UseThreadPool(int count)
        
{
            
for ( int i = 0; i < count; i++ )
            
{
                ThreadPool.QueueUserWorkItem(
                    
delegate { SlowMethod(); } );
            }

        }
And add a strategic Thread.Sleep and it's fixed:
        private static void UseThreadPool(int count)
        
{
            
for ( int i = 0; i < count; i++ )
            
{
                ThreadPool.QueueUserWorkItem(
                    
delegate { SlowMethod(); } );
                Thread.Sleep(
1);
            }

        }




posted @ 2008-05-24 12:03 Easy Company 阅读(497) 评论(0) 编辑

导航

公告

本人在此发表的文章中可能存在错误,请各位指正,在此表示谢意。但不要因为看法不同而进行人身攻击,毕竟我没有从你那里得到什么,你也没有失去什么。  计数器(2006/10/30起). Add to Google
昵称:Easy Company
园龄:6年9个月
粉丝:0
关注:0

常用链接

我的标签

随笔分类

随笔档案

文章分类

.Net site

Custom Control

MSDN

SourceForge.Net

The Code Project

推荐

最新评论

阅读排行榜

推荐排行榜