3

如果我连续调用c#异步方法如下所示:

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

异步方法能保证数据的顺序吗?

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

4

2 回答 2

2

不,我认为异步方法不能保证您发送的数据将按顺序发送或调用或发送。

正如 Marc 所说,即使它确实有效,请注意这不是正确的方法,您不应该并排或一个接一个地调用两个 BeginSend。您可以做的是在第一个 BeginSend 的回调方法中调用 EndSend,然后在该回调中调用下一个 BeginSend。

是一篇关于该主题的不错的 MSDN 文章,在继续之前先阅读它

于 2011-08-06T10:02:44.047 回答
1

通常,在调用 EndSend 之后,您只会在第一个回调中执行第二个 BeginSend。如果已经有一个不完整的 BeginSend 正在进行,我实际上希望图书馆会抛出一个异常。但如果它抛出 - 我怀疑订单是否会得到保证(我怀疑成功也会得到保证)。

您还可以考虑异步 CTP,它具有此类事情的延续,允许您“等待”发送,然后将额外的工作作为延续执行。

于 2011-08-06T10:06:57.223 回答