Socket编程:异步的发送和读取方法能保证数据的顺序吗?
Posted
技术标签:
【中文标题】Socket编程:异步的发送和读取方法能保证数据的顺序吗?【英文标题】:Socket programming : Can asynchronous methods of send and read ensure the order of data? 【发布时间】:2011-10-21 10:01:08 【问题描述】:如果我如下图连续调用c#异步方法:
socket.BeginSend(data1, 0, data1.Length, 0,
new AsyncCallback(SendCallback1), handler);
socket.BeginSend(data2, 0, data2.Length, 0,
new AsyncCallback(SendCallback2), handler);
异步方法能保证数据的顺序吗?
其他支持异步操作的网络库是否考虑了问题? 它们是如何实现的,以保证内部异步操作中的数据顺序?
【问题讨论】:
【参考方案1】:不,我认为异步方法不能保证您发送的数据将按顺序发送或调用或发送。
正如 Marc 所说,即使它确实有效,但请注意这不是正确的方法,您不应该并排或一个接一个地调用两个 BeginSend。您可以做的是在第一个 BeginSend 的回调方法中调用 EndSend,然后在该回调中调用下一个 BeginSend。
This 是一篇关于该主题的不错的 MSDN 文章,请在继续阅读之前先阅读它
【讨论】:
【参考方案2】:通常,在调用 EndSend 之后,您只会在第一个回调中执行第二个 BeginSend。如果已经有一个不完整的 BeginSend 正在进行,我实际上希望图书馆会抛出一个异常。但如果它不抛出 - 我怀疑是否能保证秩序(我怀疑也能保证成功)。
您还可以考虑异步 CTP,它具有此类事情的延续,允许您“等待”发送,然后将其他工作作为延续来执行。
【讨论】:
以上是关于Socket编程:异步的发送和读取方法能保证数据的顺序吗?的主要内容,如果未能解决你的问题,请参考以下文章