use*_*665 17 .net multithreading threadpool task-parallel-library c#-4.0
我在前几天读到,对于长期运行的任务,我最好的办法是手动创建线程,而不是使用.NET的线程池或任务并行.当我正在学习c#线程时,我真的希望有人能够启发我,特别是对于长时间运行的IO任务.先感谢您.
Nic*_*ler 17
那是真实的.线程池针对小型工作单元进行了优化,您可以通过保留线程池线程来干扰其他工作.
我的经验法则是,如果一个操作可能需要超过一秒的时间,它不应该在线程池线程上.那可能很长.
虽然这是没有记录的,但是如果你启动一个Taskwith,TaskCreationOptions.LongRunning那么将启动一个新的Thread来运行Task.
对于大多数IO任务,您应该使用框架方法的异步版本.这些使用内核函数,意味着你不会阻塞任何线程.
和往常一样,我建议阅读Joe Albahari的免费电子书,然后是Joe Duffy在Windows上的Concurrent Programming.后者是1000页长,但充满了有用的细节.
sll*_*sll 10
你是对的,ThreadPool线程是轻量级和廉价的,因为可以重新安排来从ThreadPool提供一个新的请求,所以一旦线程操作完成,ThreadPool可以重新安排相同的线程进行其他操作,你也可以通过最小线程数来操作(ThreadPool.SetMinThreads()),所以在新请求到来之前它们将一直存在.因此,对于多个轻量级操作来说,这是一个很好的解决方案,例如,您需要每隔几秒钟创建一个单独的/新的线程.
MSDN杂志上非常好的文章:专用线程还是Threadpool线程?
一旦达到最小线程数,线程池就会将创建的线程数限制为每500毫秒一个.这是一种智能机制,避免了在该时间段内释放多个线程池线程时创建新线程的昂贵成本.
从.NET 4.0开始 - 任务并行库是一个很好的高级抽象和替代手动线程管理和同步,因此您的代码不会出错.因此,只需使用TaskCreationOptions.LongRunning 创建一个Task,我相信这将是从维护性角度对应用程序架构的最佳投资.
有用的阅读:
| 归档时间: |
|
| 查看次数: |
9386 次 |
| 最近记录: |