我读了一天,对于长时间运行的任务我最好的选择是手动创建线程,而不是使用.NET的线程池或任务并行。 我真的希望有人来开导我,因为我学习C#线程,专为长时间运行的IO任务。 先感谢您。
Answer 1:
那是真实的。 线程池工作的小户型优化,你可以持有到一个线程池线程与其他工作干扰。
我的经验法则是,如果一个操作可能需要超过一秒钟,它不应该是一个线程池线程。 这可能是相当长的。
虽然这是无证,如果你开始一个Task
与TaskCreationOptions.LongRunning
然后一个新的线程将开始运行任务。
对于大多数IO任务,还有的认为你应该使用框架方法异步版本。 这些使用的内核函数,并意味着你会不会阻止任何线程。
与往常一样,我建议你阅读乔阿尔巴哈利的免费的电子书 ,随后乔达菲的在Windows并发编程 。 后者是1000页长,但充满了有用的细节。
Answer 2:
你是对的,线程池线程是轻量级的,便宜的,因为可以改期服务从线程池一个新的请求,所以一旦线程操作完成,线程池可以重新安排在同一个线程进行其它的操作,还可以通过最小线程操作数( ThreadPool.SetMinThreads() ),所以那些会,直到新的请求都还活着。 所以这是一个多轻量级操作的很好的解决方案,比如你需要创建一个单独的/新的线程每几秒钟。
在MSDN杂志一篇非常好的文章: 专用线程或线程池线程?
一旦达到的最小线程数,线程池的目的是限制正在创建每500毫秒一个线程数。 这是一个聪明的机制,避免产生新的线程,当多个线程池中的线程可以在该期限内发布的昂贵成本。
由于.NET 4.0 - 任务并行库是一个很好的高层次的抽象,替代了手工线程管理和同步功能,让你的代码是不容易出错。 所以刚才创建任务与TaskCreationOptions.LongRunning ,我相信这将是一个应用程序体系结构从maintability观点的最好投资。
有用的阅读:
- 选择任务并行库和线程池之间
文章来源: Is it true that for long running processes it is better to do thread manually instead of threadpool?