19

前几天我读到,对于长时间运行的任务,我最好的选择是手动创建线程,而不是使用 .NET 的线程池或 Task Parallel。当我正在学习 c# 线程时,我真的很希望有人能启发我,特别是对于长时间运行的 IO 任务。先感谢您。

4

2 回答 2

21

那是真实的。线程池针对小型工作单元进行了优化,您可以通过保持线程池线程来干扰其他工作。

我的经验法则是,如果一个操作可能需要一秒钟以上,它不应该在线程池线程上。那可能很长。

尽管这是未记录的,但如果您开始使用,则将启动Task一个TaskCreationOptions.LongRunning新线程来运行任务。

对于大多数 IO 任务,您应该真正使用框架方法的异步版本。这些利用内核函数,意味着您不会阻塞任何线程。

一如既往,我推荐阅读Joe Albahari 的免费电子书,然后阅读Joe Duffy 的 Concurrent Programming on Windows。后者长达 1000 页,但充满了有用的细节。

于 2012-04-24T13:22:59.740 回答
10

没错,ThreadPool 线程轻巧且便宜,因为可以重新调度以服务来自 ThreadPool 的新请求,因此一旦线程操作完成,ThreadPool 就可以重新调度同一线程以进行其他操作,您也可以通过最小线程数进行操作(ThreadPool.SetMinThreads()),所以在新的请求到来之前它们会一直存在。因此,对于多个轻量级操作,这是一个很好的解决方案,例如,您需要每隔几秒钟创建一个单独的/新线程。

MSDN 杂志上非常好的文章:专用线程还是 Threadpool 线程?

一旦达到最小线程数,线程池旨在将创建的线程数限制为每 500 毫秒一个。这是一种智能机制,避免了在该时间段内可能释放多个线程池线程时创建新线程的昂贵成本。

由于 .NET 4.0 - 任务并行库是手动线程管理和同步的一个很好的高级抽象和替代方案,因此您的代码将不易出错。因此,只需使用TaskCreationOptions.LongRunning创建一个任务,我相信从可维护性的角度来看,这将是对应用程序架构的最佳投资。

有用的阅读:

于 2012-04-24T13:22:54.950 回答