2011-08-06 29 views
2

如果我不断地调用C#异步方法如下图所示:套接字编程:发送和读取的异步方法可以确保数据的顺序吗?

socket.BeginSend(data1, 0, data1.Length, 0, 
     new AsyncCallback(SendCallback1), handler); 
socket.BeginSend(data2, 0, data2.Length, 0, 
     new AsyncCallback(SendCallback2), handler); 

异步方式,可保证数据的顺序?

支持异步操作的其他网络库是否考虑过该问题?
它们如何实现以保证内部异步操作中的数据顺序?

回答

1

不,我不认为这种异步方法可以保证你发送的数据将按顺序发送或者发送或者发送。

正如马克所说,即使它确实工作注意这是不正确的做法,你不应该两个并行或一个接一个地调用BeginSend。你可以做的是在第一个BeginSend的回调方法中调用EndSend,然后在该回调中调用下一个BeginSend。

This是关于这一主题的很好的MSDN文章阅读第一前进

0

通常你只会从第一个做回调内部的第二BeginSend之前,调用EndSend后。我真的希望如果已经有一个不完整的BeginSend正在进行,图书馆会抛出异常。但如果它抛出 - 我怀疑订单将得到保证(我怀疑成功将得到保证)。

您可能还会考虑异步CTP,它具有这类事物的延续性,允许您“等待”发送,然后执行附加工作作为延续。

0

在你的例子中,BeginSend被同一个线程调用,所以在那种情况下会有一个订单。

如果您从不同线程调用BeginSend,则需要使用监视器来同步它们。

点击此处了解详情:how many async socket requests can be going on on the same socket?

+0

在链接的第二个答案,它说:“你可以排队在同一时间多个BeginSends你并不需要锁定。” – atomd

+0

@atomd:你是对的。我的意思是,如果你想对通过不同线程发送的消息发出一个命令,你将不得不实现一些同步机制。在你的情况下,从同一个线程调用BeginSend,它将不需要同步,因为消息将以正确的顺序堆积起来。 – Damiox

相关问题