APM模式使用Threadpool中的线程?

时间:2013-08-27 05:02:19

标签: c# multithreading asynchronous

我想知道.net API中的现有I / O绑定APM调用(BeginGetResponse,BeginRead等)是否使用来自线程池的线程或使用当前线程直到回调。我知道它一直是“异步”到硬件/网卡。我也知道回调是在threadpool上执行的。我的问题是:BeginGetResponse的所有内容都在Threadpool或内容上执行,直到等待I / O在当前线程上执行;然后其余的在线程池上执行。

我希望问题很清楚。我真的很想知道BeginGetResponse是如何实现的。

4 个答案:

答案 0 :(得分:2)

APM是更通用的机制。但是您所谈论的案例使用操作系统对I/O completion ports的支持。一般的想法是你的主线程调用BeginXxx()方法。在引擎盖下,它调用ThreadPool.BindHandle(),设置管道以使端口在I / O操作完成时自动启动TP线程。该线程调用您的回调方法。

在进行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

这意味着在等待操作时不使用任何线程。操作完成后,将在线程池线程或使用其他某些同步上下文调用回调。