ThreadPool 在.Net 2.0 SP1中的部分变化可能会让你的程序停止工作
最近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:
在.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:{
for ( int i = 0; i < count; i++ )
{
ThreadPool.QueueUserWorkItem(
delegate { SlowMethod(); } );
}
}
private static void UseThreadPool(int count)
{
for ( int i = 0; i < count; i++ )
{
ThreadPool.QueueUserWorkItem(
delegate { SlowMethod(); } );
Thread.Sleep(1);
}
}
{
for ( int i = 0; i < count; i++ )
{
ThreadPool.QueueUserWorkItem(
delegate { SlowMethod(); } );
Thread.Sleep(1);
}
}
posted on 2008-05-24 12:03 Easy Company 阅读(1084) 评论(0) 编辑 收藏 举报