【发布时间】:2014-06-23 12:38:40
【问题描述】:
我是编程新手,对异步套接字编程感到困惑。
例如,假设我有两个BeginSends,一个接一个。第一个发送一百万个字符,第二个只发送 64 个字符。
由于异步性质,第二个BeginSend 不会在第一个之前完成吗?
如果是这样,我怎么知道EndRecieve收到的数据属于哪条消息?
【问题讨论】:
我是编程新手,对异步套接字编程感到困惑。
例如,假设我有两个BeginSends,一个接一个。第一个发送一百万个字符,第二个只发送 64 个字符。
由于异步性质,第二个BeginSend 不会在第一个之前完成吗?
如果是这样,我怎么知道EndRecieve收到的数据属于哪条消息?
【问题讨论】:
你真的不应该一个接一个地调用两个 BeginSend。 我认为如果发生这种情况,您最终会看到抛出异常。
您必须在调用另一个 BeginSend 之前调用 EndSend。这通常在回调函数中完成。
查看 MSDN 上的示例 Using an Asynchronous Client Socket。在回调中调用 EndSend,然后设置名为“sendDone”的 ManualResetEvent。这是一种线程间通信形式,其中回调向主线程发出异步发送完成的信号。然后,这允许您的程序提示下一条数据。
我记得做过一次的最简单的选择是在回调中为正在完成的第一条数据调用 BeginSend 以获取下一条数据。
例如
int NumBytesSent; // member variable containing how many bytes you have sent so far
string Message; // Message to send that is large
当您调用 BeginSend 时,传入一个 100 字节的块(选择一个更大的数字以获得更有效的传输,但不要太大)以发送并将 NumBytesSend 增加 100。 接下来,在上一次发送完成的回调中,您可以检查 NumBytesSent 是否
这就是您发送文件的方式,您一次发送一堆字节,然后继续发送文件块直到全部发送。
我强烈建议制作一个简单的客户端/服务器来执行诸如通过连接发送完整文件之类的操作。还可以查看 MSDN 文档和网络上的许多其他示例。
掌握这一点将有助于您处理许多其他 C# 主题,因为异步工作(或使用委托/回调)在 .NET 中很常见
【讨论】:
BeginSend method 包含一个参数AsyncCallback callback。如果你使用两个不同的回调,你可以看到哪个先完成。
但是,如果您尝试在同一连接上发送两条消息,则会遇到问题。您应该等到第一条消息发送完毕后再发送第二条消息。
【讨论】: