【问题标题】:Receiving continuous data stream with sockets in C#在 C# 中使用套接字接收连续数据流
【发布时间】:2013-11-20 18:38:47
【问题描述】:

我正在尝试编写一个客户端应用程序,它连接到指定端口上的服务器并接收数据。

我找到了this fine example,但我的问题是服务器一直在向我发送数据(没有关闭连接),因此 ReceiveCallback 永远不会结束,因为 client.EndReceive(ar) 永远不会返回 0。

所以,我的 WinForm 在接收数据时卡住了。

这个想法是监视所有传入的数据并在某些情况下进行一些回调。

我是 C# 新手,你能指出我正确的方向吗?多线程?

【问题讨论】:

  • 我认为您正在寻找的词是“连续”而不是“无限”。您可能希望在工作线程中处理接收。
  • 是的,你需要有一个单独的线程来处理等待接收和处理数据。看来您已经为自己指明了正确的方向。那里有很多关于该主题的信息。
  • BeginReceive() 的回调不会发生在主 UI 线程上,因此当您调用 EndReceive() 时,您也不在那里。因此接收连续数据不是问题。但是,如果您立即 Invoke() 回到主 UI 线程,那么我可以看到消息队列被淹没。一种可能性是将数据放入某种全局缓冲区中,然后仅定期从表单中的 Timer() 更新您的 UI 或数据。您能否提供有关数据的更多详细信息以及您正在使用它做什么?
  • 显示一些代码。特别是,显示对BeginReceive 的调用,并显示您的接收回调函数。我怀疑问题出在您认为的其他地方。

标签: c# multithreading sockets


【解决方案1】:

有两个线程:一个用于用户界面,另一个从“无限套接字”读取。无限线程以适当大小的块永远从套接字读取,可能会进行一些预处理。然后它使用 Control.Invoke() 调用 UI 线程上的方法,将块作为参数传递给它。确保块足够小,以便 UI 线程可以在不锁定的情况下处理它们,例如在 0.1 秒内。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多