为了从套接字异步接收数据,.Net支持对称的BeginReceive/EndReceive调用。基本上,您调用BeginReceive()来开始监听并标识在数据到达时应调用的回调。在回调内部,您调用EndReceive()提取数据并结束异步读取操作。

我正在编写C#/。Net软件来控制某些工业设备。控制面板允许用户设置和初始化设备,初始化后的BeginReceive()称为开始监听数据。在回调中,EndReceive()用于提取数据,但是我想立即恢复监听,因此我认为在完成BeginReceive()之后应立即再次调用EndReceive()。这样对吗?

如果是这样,是否可以在代码中的其他地方进行检查或测试,以了解是否已调用BeginReceive(),因此在调用BeginReceive()之前,我不要尝试在同一套接字上连续两次调用EndReceive()吗?

最佳答案

避免在调用BeginReceive()之前再次调用EndReceive()的方法是,将对BeginReceive()的调用放入您调用EndReceive()的完成回调中。当然,唯一不应该执行的对BeginReceive()的调用是在Socket连接后立即进行的调用。

编辑:

需要说明的是:在接收完成之前,可以多次调用BeginReceive()。但是在执行此操作时,您需要确保进行必要的内务处理,以确保以正确的顺序处理数据(即,以与通过BeginReceive()提交缓冲区的顺序相同的顺序处理缓冲区)。

因此,以上答案是关于不必做所有这些内务处理,从而使代码更简单。

如果仅在调用BeginReceive()的同一位置对EndReceive()进行后续调用,则使事情井然有序很简单。请注意,尽管您仍然需要正确执行此操作:确保始终以正确的顺序接收缓冲区的最简单方法是,仅在调用BeginReceive()之后才再次再次调用EndReceive()(但仍采用相同的方法)。

关于c# - 正确使用BeginReceive/EndReceive?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26806332/

10-09 01:17