.NET Threadpool 工作线程和异步 IO 线程

Posted

技术标签:

【中文标题】.NET Threadpool 工作线程和异步 IO 线程【英文标题】:.NET Threadpool worker threads and asynchronous IO threads 【发布时间】:2010-07-03 20:21:18 【问题描述】:

好的,据我了解,.NET 线程池维护着许多后台线程,准备用于某种任务。

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

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

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

工作线程:

    我猜是QueueUserWorkItem。 还有别的吗?

异步 IO 线程:

    例如在文件流上调用 Beginxxx、Endxxx 时使用? (或网络、串口等) 还有别的吗?

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

【问题讨论】:

【参考方案1】:

是的,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()。如果你能找到一个很好的理由来改变它们,那最好是被困在地狱里,只剩下一个小时才能赶上回家的飞机。去过那里:)

【讨论】:

先生,我有点困惑,请指导。如果我们使用委托 BeginInvoke 和 EndInvoke 而不是 QUWI,则为执行异步操作而创建的新线程 -> “这个新线程是取自 ThreadPool 吗??”。会是ThreadPool的WorkerThread还是Async IO Thread。 是的,线程池线程,和QUWI一样。工作线程,I/O 线程仅由 I/O 完成例程使用(BindHandle() 方法)。

以上是关于.NET Threadpool 工作线程和异步 IO 线程的主要内容,如果未能解决你的问题,请参考以下文章

多线程之旅(ThreadPool 线程池)

线程池(ThreadPool)

线程池和异步线程

线程池和异步线程

异步和多线程,委托异步调用,Thread,ThreadPool,Task,Parallel,CancellationTokenSource

多线程异步编程示例和实践-Thread和ThreadPool