所以我知道Send是同步的,而BeginSend是异步的。我听说Sockets Send方法在数据传输方面比BeginSend更快(注意:我说的不是CPU性能,而是发送和接收数据包的延迟)。谁能告诉我这是真的还是假的?我提到的这篇文章,我听说同步数据传输是这样的,如下所示……如果这是真的,有没有办法绕过它?或者这只是使用异步数据传输时的方式?
非常感谢你的帮助。
文章正文:
这两种通信形式都是传输数据的一种方式。不同之处在于数据传输的格式。异步通信是最广泛用于PC通信的通信方法,通常用于电子邮件应用程序、Internet访问和异步PC到PC通信。通过异步通信,数据一次传输一个字节,每个字节包含一个起始位、八个数据位和一个停止位,因此总共产生十个位。对于异步通信,存在大量开销,因为发送的每个字节都包含两个额外的位(起始位和停止位),因此会造成大量的性能损失。
同步通信是更有效的通信方法。CQ的连接解决方案通过同步通信方法进行通信。通过同步通信,数据以大数据块帧的形式传输,而不是庞大的单个字节。同步的一个优点是很容易在每个块的开头和结尾插入控制信息,以确保恒定的定时或同步。同步的另一个优点是它比异步更有效。例如,56Kbps拨号同步线路每秒可承载7000字节(56000/8),而56Kbps异步拨号线路每秒只能承载5600字节(56000/10)。当传输大量信息时,这会显著提高速度和性能。
发布于 2011-05-19 22:14:56
我听说Sockets Send方法的数据传输速度比BeginSend快
不是这样的。
至于文章正文。你说的是两件截然不同的事情。一种异步网络连接和计算机程序中的异步方法。
发布于 2011-05-20 08:41:47
这肯定不是真的。本文在网络连接类型的上下文中讨论了同步和异步。但是,它与如何使用套接字发送数据没有任何关系。在.Net中,Synchronous和Asynchronous仅仅意味着方法将阻塞(Synchronous)和非阻塞(Asynchronous),与数据传输速度无关。在使用的任何同步和异步方法中,延迟都是相同的。
发布于 2013-02-19 04:25:48
我要说的最关键的一点是,同步套接字方法更容易编程,并且可以在单个包装器函数中完成。(我假设您将继承Socket类,并添加您的自定义错误处理、日志记录等来包装发送和接收)
在异步的情况下,您将至少需要两个函数和另一个类或结构(一个StateObject)来跟踪您打算传输的内容。
您当然可以使用匿名委托技术屏蔽回调方法的存在,但这不会改变这样一个事实,即您的代码将更难理解(和维护)。
我不能精确地给函数计时,但我看到对于较小的字节(<4K),同步似乎更快,而对于较大的块(> 8K),异步似乎更好。也许,当您使用ASync接收更大的缓冲区时,Async func已经前进,并在您处理之前收到的数据块时为您获得了更多的字节。
https://stackoverflow.com/questions/6060030
复制相似问题