异步Socket和多线程并没有矛盾。异步Socket的优势在于可以在一个线程中处理很多Socket的请求,因为Socket的读写操作很多时间都花费在网络上,所以线程在发出异步读写操作后可以去处理别的Socket的请求。对于典型的异步Socket构造的服务器,一个线程也只能处理不到64个Socket对象的请求,这种情况下仍然需要多线程的支持。
解决方案 »
- 关于委托的问题
- [C#通信]关于WCF的逻辑关系
- c#中如何在下一窗体,获取上一窗体datagridview控件中选中多行的值
- 求!哪位前辈给我发个水晶报表的完整开发程序!非常感谢!.net的!
- 如何让datagridview里的checkbox列默认选中状态
- 100 分求解入门级问题,顶者有分
- XML奇怪的问题!!!!!!!在线等待。。。。
- 网络软件中更新远程数据库记录是使用WEB服务还是Socket或其他?
- 在winform里怎样将DataGrid导入到Excel里呢?
- C#中如何实现类似vb中split函数那样的功能,请指教!急!
- 当一个合格的程序员的最低要求
- 做一个合格的开发小组长都需要掌握什么呢?
我想说使用它是不需要编程者在写程序的时候使用多线程的技术来做什么接受啊,发送啊等等的,但是那本书在介绍'C#的异步Socket'的编程时竟然还是使用多线程技术的和同步的几乎一样,这是误认子弟啊.差点将我带入歧途,好的方法不敢独享贴出来大家看看,是不是这么回事.我做的测试:两台PC2.4G 512M 分别建立客户端,服务器,客户端执行 连接->发送(100k)(异步)->接受到服务器回复数据后关闭(异步)
服务器执行 接受连接(异步)->接受数据(异步)->回复数据(异步)
客户端执行循环5000次,循环中没有使用延迟技术
测试通过,没有任何错误,同时服务器的CPU占用只有3-4%,要是同步的服务器早就晕了.源代码请使用论坛的查询功能关键字是"为了不让<<Visual C#.Net 核心网络核心编程>> 误导大家对异步Socket"
我不太了解Unix/Linux操作系统的情况,不知道它的线程是否可以轻量级到开销比Windows低很多的程度,但对Windows操作系统而言,大量的线程确实会有比较大的开销,而且如果是用同步Socket,你用一个线程处理一个Socket的话只能实现一个单工操作的系统,如果想实现全双工,对每个Socket需要有两个线程处理,这样系统开销就更大了。而对于异步操作,是没有这种问题的,一个活动线程在网卡发送数据时,完全可以去做别的更有意义的事,比如数据处理这种真正需要CPU资源的操作,而不是毫无意义的等待网卡这种慢速设备发送数据。早期apache对每一个请求都是一个进程处理,这是因为Unix/Linux的进程实现和Windows的进程不一样,Windows的进程是重量级的,而Unix/Linux上的进程是轻量级的,其开销和Windows下的线程类似,所以一个请求用一个进程处理也是可以接受的。至于我对WSAAsyncSelect的观点,很大程度上是依赖于我的推断,而不是基于实际测试,如果说错了希望大家指出来。WSAAsyncSelect操作的结果是通过Windows的消息通知给应用程序,而一个窗口的消息队列中还充斥着很多别的与数据毫不相关的消息,这样,随随便便的一个消息的处理就可以影响你对一个网络数据发送/接收操作的及时响应。而且如果界面程序中某个地方有一个比较长的循环,其中只用PeekMessage处理了界面更新的消息,那这段时间内系统发给你的Socekt消息就不会得到处理,这对于一个对传输效率要求比较高的场合显然是无法接受的。当然了,对于一些的客户端系统,如果不想为网络操作开一个线程,而且对传输效率的要求也不高,用WSAAsyncSelect还是很方便的。
1 阻塞模型(同步模式)
2 select模型(异步模式)
3 WEAAsyncSelect模型(异步模式)
4 WSAEventSelect模型(异步模式)
5 重叠模型(异步模式)
6 完成端口模型(异步模式)困了,下会在贴他们的介绍,以及测评.
多线程: 为了提高程序速度
虽然会增加系统负担,但是你的程序速度变快了,对于server来说,这是很合理的
是这些模型的测评报告,以及详细描述,感谢 sxbyl(会用Windows的白菜)我想无论在任何应用情况下
完成端口模型(异步模式)
都是最好的,不知道大家对此有何质疑?