【发布时间】:2018-05-24 07:18:12
【问题描述】:
我正在尝试了解 I/O 完成端口,特别是它们与使用 async-await 进行 I/O 的关系。
臭名昭著的文章There is No Thread 谈到在 I/O 完成后短暂借用 IOCP。因为这篇文章的全部意义在于表明,当花哨的硬件级 I/O 东西在进行中时,没有线程会被像这样的循环所消耗
I/O 完成了吗?没有。I/O 完成了吗?没有。I/O 完成了吗?没有。...
但后来我看到 this article 上面写着一个
"组件负责检查队列的完成端口 元素”
并给出一个类似
的例子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 应用程序有 2 种类型的线程池 - (1)“工作线程”和 (2)“I/O 线程”是真的吗?
- 如果是真的,是否有一个在配置中指定的固定数量,例如 M 个工作线程和 N 个 I/O 线程? M和N的比例通常是多少?
- 具体何时使用 I/O 线程?
【问题讨论】:
-
您的问题得到解答了吗? :)
标签: c# .net multithreading asynchronous async-await