async
-await
进行I/O操作的关系。臭名昭著的文章“没有线程”谈到了在I/O完成后临时借用IOCPs的问题。因为整篇文章的重点在于展示当高级硬件层面的I/O操作正在执行时,没有线程会被循环占用,如下所示:
但是我看到这篇文章中提到一个组件负责检查队列中的完成端口,并给出了以下示例:I/O完成了吗?不是。 I/O完成了吗?不是。 I/O完成了吗?不是。...
public class IOCompletionWorker
{
public unsafe void Start(IntPtr completionPort)
{
while (true)
{
uint bytesRead;
uint completionKey;
NativeOverlapped* nativeOverlapped;
var result = Interop.GetQueuedCompletionStatus(
completionPort,
out bytesRead,
out completionKey,
&nativeOverlapped,
uint.MaxValue);
var overlapped = Overlapped.Unpack(nativeOverlapped);
if (result)
{
var asyncResult = ((FileReadAsyncResult)overlapped.AsyncResult);
asyncResult.ReadCallback(bytesRead, asyncResult.Buffer);
}
else
{
ThreadLogger.Log(Interop.GetLastError().ToString());
}
Overlapped.Free(nativeOverlapped);
}
}
}
var completionPortThread = new Thread(() => new IOCompletionWorker().Start(completionPortHandle))
{
IsBackground = true
};
completionPortThread.Start();
在我看来,似乎正在进行一些轮询。
我想我的问题可以归结为:
- .NET应用程序是否有两种类型的线程池 -- (1)“工作线程”和(2)“I/O线程”?
- 如果是这样,是否有一个固定的数量,在配置中指定,例如M个工作线程和N个I/O线程?通常M与N的比例是多少?
- I/O线程确切地在何时使用?