UDP 接收数据同步 异步选择问题 同步线程模式 完全没有IAsyncResult对象的问题 是这个原因速度提高了吗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我测试了收到数据后操作界面,全部接收完毕后界面会卡很久并发了近100W次的界面操作使用同步、异常的差距就在UDP 缓存 因为接收数据速度不一样,局域网急速发速度的时候整个缓冲区一下就被填满导致信息覆盖connect.ReceiveBufferSize = ReceiveBufferSize; 默认好像是8K 同步模式能基本保证客户端发送一条,服务器基本能马上接收到并发出界面操作事件。异步会因为缓冲区被覆盖导致丢失大量信息。 嗯嗯 就是这个意思,我理解应该是没错。因为缓冲区大小问题 用异步要设置的很大(我测试的比较暴力,几台机器每秒10W个小数据包发送)用异步缓冲区必须设置的很大才能保证数据不被覆盖(同意拿100W个包比同步慢40%)同步少了IAsyncResult 开销缓冲区有数据时拿走的快。 UDP 本来就是不可靠协议 ,而且UDP 的包一般不会粘包的吧(不会像TCP把各种小包打包到一起发送,就算1个字节UDP也是一个包发过来),退一步说不管怎么做这些都要处理(并发的事件)而且(UDP我打算是做信息传递,不发送大于1400的信息)我只是觉得单纯说接收数据包速度而言同步+线程的模式比直接使用异步方法效率更高。 也有可能某个人今天要来3个快递,但是不是一起来的,而是分别送了3次才送来的 this.ReceiveData(packet, this.remoteEndPoint, null); this.remoteEndPoint 可以当作是人packet 可以在里面添加信息表示要三个包都到了才是完整。 3.5 提供的 SocketAsyncEventArgs 类好像也降低了 IAsyncResult 的开销来提高效率 我还测试了并发事件的时候 先并发事件--->回调 线程池会按照接收到的数据次序处理界面, 先回调--->并发事件 线程池会把接收到的数据次序打乱处理界面, 你终于拿出一些具体的东西来问了。实际上如果按照你说的“同步处理快、异步处理慢”,那么你也就看不到什么“丢失大量信息”的问题了。反之,正由于你的程序在并发处理时有bug而丢处理,并且异步系统的处理速度比你认为以为得更快许多,所以你才会搞不定的。同步、阻塞、循环,程序运行得很慢很卡,所以你才会觉得你的程序“稳定”。这时侯你应该好好看看你的程序设计问题。一般人都知道,当他异步、并发处理时,往往再写的有bug时会“丢失数据操作”,所以他就会努力找到自己的程序bug,而不会去怪“异步并发程序运行太慢所以丢数据”的。 嗯咯 我大概总结出来了,不管同步异步,始终高强度接收数据包的情况下如果来不及处理收到的数据包(收包,后台处理)。在程序内部并发数越来越多导致并发达到极限,内存CPU需求急剧上升最终-----》程序卡死缓冲区覆盖未处理的数据包---》丢包,程序内部处理不及时也会导致最终------》程序卡死不管怎么样一个程序总有一个处理极限,达到这个极限就会出现问题只能根据实际应用,网络情况来判断程序能不能承受。 不考虑代码质量太差的情况,只考虑正常的应用中要么是用空间换时间,也就是要速度快,占内存和CPU资源就要多要么是用时间换空间想两个都提升,代码优化的空间毕竟有限,升级硬件才是根本的解决之道台式机到极限了,就换服务器,服务器到极限了,就换服务器组 如何获取 ClickOnce 部署的应用程序的发布版本号?(不是程序集版本号) textbox如何可以显示不可见字符 C# 产生正太分布随机数问题 以毫米为单位画图 怎么在一个 winform窗口关闭时候出现确认是否关闭对话框 高手给看一下,怎么更新不了数据 简单的ADO.NET问题 Base-64 字符串中的无效字符 我如何使用工程中添加的图片文件?谢谢。在线等。 女朋友生日我送什么给她好呢??? c#结构体大小的计算 在线等,着急...C# 输出 JSON字符串到页面上
使用同步、异常的差距就在UDP 缓存 因为接收数据速度不一样,局域网急速发速度的时候整个缓冲区一下就被填满导致信息覆盖
connect.ReceiveBufferSize = ReceiveBufferSize; 默认好像是8K 同步模式能基本保证客户端发送一条,服务器基本能马上接收到并发出界面操作事件。异步会因为缓冲区被覆盖导致丢失大量信息。
因为缓冲区大小问题 用异步要设置的很大(我测试的比较暴力,几台机器每秒10W个小数据包发送)
用异步缓冲区必须设置的很大才能保证数据不被覆盖(同意拿100W个包比同步慢40%)
同步少了IAsyncResult 开销缓冲区有数据时拿走的快。
而且(UDP我打算是做信息传递,不发送大于1400的信息)
我只是觉得单纯说接收数据包速度而言同步+线程的模式比直接使用异步方法效率更高。
this.ReceiveData(packet, this.remoteEndPoint, null);
this.remoteEndPoint 可以当作是人
packet 可以在里面添加信息表示要三个包都到了才是完整。
先并发事件--->回调 线程池会按照接收到的数据次序处理界面,
先回调--->并发事件 线程池会把接收到的数据次序打乱处理界面,
你终于拿出一些具体的东西来问了。实际上如果按照你说的“同步处理快、异步处理慢”,那么你也就看不到什么“丢失大量信息”的问题了。反之,正由于你的程序在并发处理时有bug而丢处理,并且异步系统的处理速度比你认为以为得更快许多,所以你才会搞不定的。同步、阻塞、循环,程序运行得很慢很卡,所以你才会觉得你的程序“稳定”。这时侯你应该好好看看你的程序设计问题。一般人都知道,当他异步、并发处理时,往往再写的有bug时会“丢失数据操作”,所以他就会努力找到自己的程序bug,而不会去怪“异步并发程序运行太慢所以丢数据”的。
在程序内部并发数越来越多导致并发达到极限,内存CPU需求急剧上升最终-----》程序卡死
缓冲区覆盖未处理的数据包---》丢包,程序内部处理不及时也会导致最终------》程序卡死
不管怎么样一个程序总有一个处理极限,达到这个极限就会出现问题
只能根据实际应用,网络情况来判断程序能不能承受。
要么是用空间换时间,也就是要速度快,占内存和CPU资源就要多
要么是用时间换空间想两个都提升,代码优化的空间毕竟有限,升级硬件才是根本的解决之道
台式机到极限了,就换服务器,服务器到极限了,就换服务器组