.NET中工作线程和I / O线程的简单描述

很难找到.NET中的工作线程和I / O线程的详细但简单的描述

关于这个话题,我清楚了解(但在技术上可能不精确):

>工作线程是应该使用CPU工作的线程;
> I / O线程(也称为“完成端口线程”)应该使用设备驱动程序进行工作,并且基本上“不执行任何操作”,只监视非CPU操作的完成。

什么不清楚:

>虽然方法ThreadPool.GetAvailableThreads返回两种类型的可用线程数,似乎没有公共API调度I / O线程的工作。您只能在.NET中手动创建工作线程?
>似乎单个I / O线程可以监视多个I / O操作。是真的吗?如果是这样,为什么ThreadPool默认有这么多可用的I / O线程?
>在一些文本中,我读取回调,在I / O线程执行I / O操作完成后触发。是真的吗?这不是工作线程的工作,考虑这个回调是CPU操作?
>要更具体 – 做ASP.NET异步页面的用户I / O线程?在将I / O工作切换到单独的线程而不是增加工作线程的最大数量时,性能究竟是什么?是因为单个I / O线程监视多个操作吗?或者Windows在使用I / O线程时更高效的上下文切换?

.net / CLR中的“工作线程”通常只是指除主线程之外的任何线程,它代表生成线程的应用程序执行某些“工作”。 “工作”真的意味着什么,包括等待一些I / O完成。 ThreadPool保持工作线程的缓存,因为线程创建起来很昂贵。

.net / CLR中的’I / O线程’一词是指ThreadPool为了从“重叠”的win32调用(也称为“完成端口I / O”)调度NativeOverlapped回调而保留的线程。 CLR维护自己的I / O完成端口,并且可以绑定任何句柄(通过ThreadPool.BindHandle API)。这里的示例:http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx.许多.net API在内部使用此机制接收NativeOverlapped回调,虽然典型的.net开发人员不会直接使用它。

在’工作线程’和’I / O线程’之间确实没有技术上的区别 – 它们都是正常的线程。但是CLR ThreadPool保持每个池的单独池,以避免对工作线程的高需求耗尽所有可用于分派本地I / O回调的线程的情况,从而潜在地导致死锁。 (想象一个使用所有250个工作线程的应用程序,其中每个工作线程都在等待一些I / O完成)。

开发人员在处理I / O回调时需要小心,以确保I / O线程返回到ThreadPool – 也就是说,I / O回调代码应该执行服务回调所需的最低工作量然后将线程的控制权返回到CLR线程池。如果需要更多的工作,那么应该在工作线程上安排该工作。否则,应用程序冒着“劫持”CLR的保留I / O完成线程池,用作正常工作线程,导致上述死锁情况。

一些好的参考进一步阅读:
win32 I / O完成端口:http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx
managed threadpool:http://msdn.microsoft.com/en-us/library/0ka9477y.aspx
BindHandle的示例:http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx

http://stackoverflow.com/questions/2099947/simple-description-of-worker-and-i-o-threads-in-net

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:.NET中工作线程和I / O线程的简单描述