2010-03-05 278 views
8

使用委托我可以异步调用任何函数。 从文档中我明白这是通过排队threadpool的工作项来完成的。异步调用和异步io调用之间的差异.net

也可以对IO函数进行异步调用(如从套接字,文件,网页等中读取)。我认为(但我不确定)这不会产生线程池中的工作项。只有获得结果(或错误)后,才能从线程池中的新线程调用该回调。

这个假设是否正确?或者是一个异步的IO调用,也包括一些产生的线程?如果是这种情况,那么异步调用如何能比自己产生线程(使用线程池)更好的性能?

另请参见:有多少个异步调用可以在任何给定时间处理?如果使用线程池,我想尽可能多的。但是在IO异步调用的情况下,是否有限制?那么,你怎么知道限制是什么?

回答

7

异步IO比使用线程池中的另一个线程复杂得多。

有许多不同的技术内部OS,支持异步IO:

1信令的装置内核对象

针对单个设备执行多个同时I/O请求不是有用的。允许一个线程发出I/O请求,另一个线程处理它。

2信令事件内核对象

允许针对单个设备的多个同时的I​​/O请求。允许一个线程发出I/O请求,另一个线程处理它。

3使用可报警I/O

允许针对单个设备的多个同时的I​​/O请求。发出I/O请求的线程也必须处理它。

4使用I/O完成端口

允许针对单个设备的多个同时的I​​/O请求。允许一个线程发出I/O请求,另一个线程处理它。这种技术具有高度的可扩展性并且具有最大的灵活性。

+0

@sergey:所以你说的确有区别。那么有多少IO请求可以在任何时候处于等待状态?什么是甜点?这是依赖于目标IO或其他东西?如何知道? – Toad 2010-03-05 09:04:26

+0

Simle答案:这取决于。如果您使用IO完成端口(这是最复杂但功能最强大的技术),OS将创建尽可能少的线程(取决于您的硬件配置)以处理所有活动的IO任务。使用可警告的IO需要一个线程!等待IO操作。这就是为什么IO端口更加有效和可扩展的原因:你可以处理很多!用最少的资源同时提供IO请求。我想你应该阅读Jeffrey Richter的“Windows通过C/C++”或“编程服务器端应用程序”来理解所有这些。这是非常艰难的东西! – 2010-03-05 09:17:06

+0

@reinier限制基于从您的CPU数量到您的Windows许可证密钥的所有内容。但限制并不重要 - 只要您使用BCL提供给您的异步方法,您就会知道*您将获得比如果您更好的可扩展性。 'QueueUserWorkItem'。 – bzlm 2010-03-05 12:59:46