2010-07-03 160 views
6

好吧,据我所知,.NET线程池维护着许多后台线程,可以用于某种任务。.NET线程池工作线程和异步IO线程

Get/SetMinThreads和Get/SetMaxThreads方法包含两个可以返回或调整的参数。

根据MSDN这两个参数表示工作线程的数量和用于异步IO操作的线程数。

什么类型的操作使用这些特定类型的线程?

工作线程:

  1. QueueUserWorkItem我相信。
  2. 还有什么?

异步IO线程:

  1. 调用的BeginXXX,Endxxx上例如文件流时使用? (或网络,串口等)
  2. 还有什么?

感谢您的任何澄清,或有关该主题的良好链接。

回答

6

是的,QUWI也是委托类型的BeginInvoke()方法。并且由几个类使用,BackgroundWorker是最着名的示例。它底层仅使用委托的BeginInvoke()。

I/O完成线程是一个非常低级别的Windows功能,用于在I/O请求完成时快速运行代码。从ReadFileEx()函数的最后一个参数中可以看出,还有其他的。通过ThreadPool.BindHandle()公开被管理的等价物。

这是.NET类的工作,以获得正确的。只有少数人使用它:FileStream,PipeStream,FileSystemWatcher,Socket,SerialPort的内部工作线程和一些WCF通道支持类。

我个人不喜欢在API中暴露这些配置细节,尤其是I/O完成线程。这是BCL团队的一次警惕,也是他们最终的一些FUD。这些设置会影响整个程序,默认设置已经很慷慨。修补它们大致相当于调用GC.Collect()。如果你设法找到一个很好的理由去改变它们,那么只需要一个小时就能将飞机赶回家中,那么最好的办法就是将它卡在地狱中。在那里:)

+0

先生,我有点困惑请指导。如果我们使用代表BeginInvoke和EndInvoke代替QUWI,则创建的新线程将执行异步操作 - >“这是从ThreadPool中获取的新线程吗?”。它将成为ThreadPool的WorkerThread或异步IO线程。 – Dinesh 2012-10-17 14:51:52

+2

是的,线程池线程与QUWI相同。工作线程,I/O线程仅由I/O完成例程(BindHandle()方法)使用。 – 2012-10-17 15:18:14

+0

谢谢先生:) – Dinesh 2012-10-17 15:23:48