为了从套接字异步接收数据,.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/