C#异步套接字BeginSend EndReceive
我是编程新手,对异步套接字编程感到困惑 例如,假设我有两个C#异步套接字BeginSend EndReceive,c#,sockets,C#,Sockets,我是编程新手,对异步套接字编程感到困惑 例如,假设我有两个BeginSends,一个接一个。第一个发送一百万个字符,第二个只发送64个字符 由于异步的性质,第二个BeginSend不会在第一个之前完成吗 如果是这样,我如何判断在EndRecieve接收的数据属于哪条消息?包含一个参数AsyncCallback。如果您使用两个不同的回调,您可以看到哪一个首先完成 但是,如果您试图在同一个连接上发送两条消息,则会出现问题。在发送第二条消息之前,您应该等待第一条消息完全发送。您真的不应该一个接一个地呼
BeginSend
s,一个接一个。第一个发送一百万个字符,第二个只发送64个字符
由于异步的性质,第二个BeginSend
不会在第一个之前完成吗
如果是这样,我如何判断在EndRecieve
接收的数据属于哪条消息?包含一个参数AsyncCallback
。如果您使用两个不同的回调,您可以看到哪一个首先完成
但是,如果您试图在同一个连接上发送两条消息,则会出现问题。在发送第二条消息之前,您应该等待第一条消息完全发送。您真的不应该一个接一个地呼叫两个BeginSend。 我认为如果发生这种情况,您最终会看到抛出异常 在调用另一个BeginSend之前,必须先调用EndSend。这通常在回调函数中完成 查看MSDN上的示例。在回调中调用EndSend,然后设置名为“sendDone”的ManualResetEvent。这是线程间通信的一种形式,其中回调向主线程发出异步发送完成的信号。这样,您的程序就可以提示下一条数据
- 从主线程调用BeginSend以发送前1000000字节
- 您的主线程可以检查信号量或类似ManualResetEvent的东西,以触发它发送下一个64字节。另一个选项是使用队列发送数据
- 数据发送完成后,将调用传入BeginSend的回调
- 在此回拨中,您将调用EndSend。按照此操作,然后设置ManualResetEvent,或您希望使用的任何线程间触发器李>
掌握好这一点将有助于您处理许多其他C#主题,因为异步工作(或使用委托/回调)在.NET中非常常见我认为发送可能会起作用,但我怀疑消息将变得交错且不可解析。这就是问题所在。我如何避免这种情况?这是可以做到的,因为像mirc这样的应用程序一直在处理此类问题。我想知道如何实现它?等待第一条消息完全发送?我应该在EndSend中有代码来检查第一条消息是否完成?是的。您不需要“EndSend中的代码来检查第一条消息是否完成”。当您收到回拨时,表示发送已完成。谢谢Fuzz,您提到了一个要点。我不确定这种行为。我只是想在编写代码之前澄清一些疑问。谢谢马克,这一直是我构建网络代码的方式。我已经做过很多次了,但总是从一个通用的简单起点开始,然后再开始。有人能解释一下它们的意思吗:它假设一个名为connectDone的全局ManualResetEvent。@Eidenai MSDN站点上的示例没有提供示例所需的所有成员或全局变量。在本例中,他们假设您在某个地方有一个名为connectDone的ManualResetEvent类型的可访问变量,以便他们可以使用它与connectDone.WaitOne()和connectDone.Set()进行线程间通信。此变量需要位于两个线程都可以访问的位置
int NumBytesSent; // member variable containing how many bytes you have sent so far
string Message; // Message to send that is large