要从套接字异步接收数据,.Net 支持对称的 BeginReceive/EndReceive 调用。基本上你调用BeginReceive()
开始监听并确定数据到达时应调用的回调。在回调中调用 EndReceive()
提取数据并结束异步读取操作。
我正在编写 C#/.Net 软件来控制一些工业设备。控制面板允许用户设置和初始化设备,一旦初始化 BeginReceive()
被称为开始监听数据。在回调EndReceive()
用于提取数据,但我想立即恢复收听所以我想我应该调用BeginReceive()
在执行 EndReceive()
之后再次.这是正确的吗?
如果是这样,是否有我可以在代码的其他地方使用的检查或测试来了解 BeginReceive()
是否存在?已经被调用所以我不尝试调用 BeginReceive()
在同一 socket 上连续两次,在 EndReceive()
之前被称为?
最佳答案
避免调用 BeginReceive()
的方式在你打电话之前再次EndReceive()
是把电话拨给BeginReceive()
进入你调用 EndReceive()
的完成回调.唯一的电话 BeginReceive()
不应该执行的是,当然,您在 Socket
之后立即执行的那个已连接。
编辑:
明确一点:允许调用BeginReceive()
在任何接收完成发生之前任意次数。但是当你这样做时,你需要确保你做了必要的内务处理,以确保你以正确的顺序处理数据(即你处理缓冲区的顺序与你通过 BeginReceive()
提交它们的顺序相同)。
所以上面的答案是关于不必做所有这些内务处理,从而使代码更简单。
如果您只对 BeginReceive()
进行后续调用在你打电话的地方EndReceive()
,让事情井井有条是微不足道的。请注意,您仍然需要正确执行此操作:确保始终以正确顺序接收缓冲区的最简单方法就是不调用 BeginReceive()
。再次调用直到之后你调用了EndReceive()
(但仍然采用相同的方法)。
关于c# - 正确使用 BeginReceive/EndReceive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26806332/