我想知道.net API中的现有I / O绑定APM调用(BeginGetResponse,BeginRead等)是否使用来自线程池的线程或使用当前线程直到回调。我知道它一直是“异步”到硬件/网卡。我也知道回调是在threadpool上执行的。我的问题是:BeginGetResponse的所有内容都在Threadpool或内容上执行,直到等待I / O在当前线程上执行;然后其余的在线程池上执行。
我希望问题很清楚。我真的很想知道BeginGetResponse是如何实现的。
答案 0 :(得分:2)
在进行I / O操作时, no 线程正在等待的核心思想。
MessageQueue,FileStream,PipeStream,Socket,FileSystemWatcher,IpcChannel和SerialPort支持此功能。
答案 1 :(得分:1)
在当前线程上执行BeginXxx。您可以使用例如自己轻松验证这一点。反射器。此外,有时回调也在当前线程上执行。一种情况是早期发生错误,另一种情况是实际异步I / O操作阻塞 - 有时发生这种情况,如asynchronous I/O is not guaranteed not to block。
答案 2 :(得分:0)
使用工作线程线程的IAsyncResult方法仅适用于某些任务。像FileIO(不是目录枚举),LDAP查询(v2.0),ADO .net查询。 如果您拥有它并且可以承担复杂性,请使用APM。它们通常由.net人员构建,因为它需要一些复杂性。 否则,如果您认为自己会获得速度,请使用手工制作。 使用显式线程可以提供更多控制。具体来说,您可以选择具有前台线程,这将在主线程从Main返回后保持应用程序“活动”。显式线程也可以指定其COM线程单元。 一般规则是在有工作项队列时使用线程池,并在有架构需要时使用显式线程。
答案 3 :(得分:0)
许多操作使用IO completion ports。
这意味着在等待操作时不使用任何线程。操作完成后,将在线程池线程或使用其他某些同步上下文调用回调。