首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用BeginReceive / EndReceive?

正确使用BeginReceive / EndReceive?
EN

Stack Overflow用户
提问于 2014-11-07 17:03:26
回答 2查看 3.7K关注 0票数 5

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

我正在编写C#/.Net软件来控制一些工业设备。控制面板允许用户设置和初始化设备,一旦设备初始化,BeginReceive()就称为开始侦听数据。在回调中,EndReceive()用于提取数据,但我希望立即恢复侦听,因此我认为应该在执行EndReceive()之后再次调用EndReceive()。这是正确的吗?

如果是这样的话,我是否可以在代码的其他地方使用检查或测试来确定BeginReceive()是否已经被调用,以便在调用BeginReceive()之前,不要在同一个套接字上连续调用EndReceive()两次?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-07 17:45:44

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

编辑:

要明确的是:在任何接收完成之前,都可以任意次数地调用BeginReceive()。但是,当您这样做时,您需要确保您做了必要的内务管理,以确保您以正确的顺序处理数据(即,您按照通过BeginReceive()提交数据的相同顺序处理缓冲区)。

因此,上面的答案是,不必做所有的内务管理,从而保持代码更简单。

如果您只在调用BeginReceive()的同一个地方调用EndReceive(),那么将事情安排得井井有条是很简单的。注意,您仍然需要正确地执行该操作:确保始终以正确的顺序接收缓冲区的最简单方法是,在调用BeginReceive() (但仍然使用相同的方法)之前,不要再次调用EndReceive()

票数 6
EN

Stack Overflow用户

发布于 2014-11-07 17:17:57

是的,您需要在接收完数据之后调用BeginReceive,以便在数据可用时获得更多的数据。

应该由您来处理Socket的状态,在这种状态下,您不需要两次调用BeginReceive。有一些属性可以让您知道数据是否可用,但是没有任何属性可以告诉您是否已经在等待接收数据。

Socket的大多数实现都是另一个具有此逻辑的包装类,因此,如果第二次调用BeginReceive,则会忽略它。Socket类有时有点痛苦,因为您不能在不关闭的情况下取消BeginReceive

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26806332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档