★请教一个C#关于性能的基础问题。标题要长,关键字【完成端口】【异步】【线程池】
想请教各位大侠一个问题,C#中使用.net框架提供的异步操作:比如对文件的异步读写,对网络的异步读写,对其他资源的操作。在这些操作中,是否已经是效率最高了?
C++中常用完成端口来实现密集的大量访问。而C#本身却没有提供类似的类库,我看到有些人自己用线程池写了模拟完成端口的东西。
但是我想请问.NET框架内本身提供的异步方式是否再内部也使用了类似完成端口的技术?
(好像见一个人说 TCPCLIENT中对NETSTREAM的异步操作是特殊实现的,也使用了完成端口?)
还有,如果C#程序已经使用线程池了,那么对读写类操作直接使用线程池调委托的方式是否和使用完成端口效率一样?还有必要写完成端口类么?
再这方面比较欠缺,可能提的问题本身就有毛病,
希望各位大侠能给透彻的讲讲哦
谢谢了。
------解决方案--------------------帮顶
------解决方案--------------------俺最近也在关心这个技术。个人理解,Socket在使用IOCP时,用到了主要技术之一是其SocketAsyncEventArgs。不像这个类可以重复使用,而普通的异步Begin/End操作时IAsyncResult对象不能重复操作。当然,在一个IOCompleted事件中编程,代码简洁些。
.NET 2.0中使用IOCP技术,个人认为就是使用其xxxAsync函数,包括SocketAsyncEventArgs池等,但俺实际使用时却时发现了如下现象(也许是理解不正确或技术不到家):
1)ReceiveAsync与SendAsync不能同时,而Begin/End可以同时任意异步操作;
2)ReceiveAsync/SendAsync的缓冲区SetBuffer时,是共享的。也就是说,发送时的缓冲区和接收的缓冲区是一个(针对SetBuffer命令),不能独立分开配置
从1)、2)看,xxxAsync在接收和发送时需要同步!似乎不可想象!希望有高人给点指导。
------解决方案--------------------up
------解决方案--------------------LZ的签名很个性
------解决方案--------------------貌似C#的SOCKET异步模型就是基于完成端口的
------解决方案--------------------mark up
------解决方案--------------------mark