【问题标题】:Background worker not running后台工作人员未运行
【发布时间】:2011-02-01 02:31:22
【问题描述】:

我有一个 C# 应用程序,通过它我可以配置以太网摄像机的参数。相机充当服务器,应用程序充当客户端。

有 2 个用于通信的套接字,一个用于数据/命令通信 - 数据套接字(2 路通信)和另一个用于图像的套接字,相机通过图像套接字发送图像(单向通信)。只要有硬件触发,相机就会通过图像套接字发送图像(硬件触发何时到来是不可预测的)。

用户可以通过更改 GUI 中的值来配置相机。当用户更改参数时,应用程序通过命令套接字将命令和数据发送到相机并等待响应(接收超时为 5 秒)。相机接收命令并发送回响应。 GUI 收到它更新它成功更新的用户。

我已将图像套接字放在后台工作程序中。它内部的无限 while 循环不断轮询图像套接字中的图像,并且每当接收到图像时,它都会显示在 GUI 中(我使用委托来执行此操作)。一切都很好:)

现在,当触发器到达相机时,它会发送图像。在用户更改参数的同时,应用程序发送命令/数据并等待响应。只有在图像发送完毕后,相机才会收到命令。当应用程序等待命令响应时,后台工作程序(接收图像)没有运行。因此,UI 正在等待命令套接字中的响应,并且相机正在图像套接字中发送图像,并且 UI 没有接收到图像,因为后台工作程序没有运行。它变成了死锁,并且超时(5 秒)发生在命令套接字:(.

为什么socket等待超时时backgroundworker没有运行? 我用线程替换了后台工作人员,并将优先级设置为最高。错误(超时)频率已经下降,但偶尔会发生同样的问题。你们中的任何人都可以帮我解决这个问题并帮助我理解问题。

谢谢, 毗湿奴

【问题讨论】:

    标签: c# backgroundworker tcpclient


    【解决方案1】:

    我建议您确保用于从后台工作人员刷新图像的委托被异步调用(使用 BeginInvoke)。同步调用可能会导致互锁。

    【讨论】:

      【解决方案2】:

      如果没有看到代码,很难弄清楚这一点,但我怀疑这个问题与应用程序 UI 锁定等待响应有关。

      发送命令后它在等待哪个线程?如果 UI 线程的设计不好 - UI 线程应该永远不需要等待任何东西。

      创建另一个用于通过命令/数据套接字进行通信的线程。 UI 可以简单地将命令放入ConcurrentQueue<T>BlockingCollection<T>。拥有数据套接字的线程将使用队列中的命令,将它们发送到相机,等待最多五秒钟,然后将消息发送回 UI(使用 Invoke)。该线程将对命令/数据套接字的所有访问进行序列化,以确保任何时候只有一个命令处于活动状态。

      【讨论】:

      • 感谢您的回复。我将尝试您建议的这种方法并返回。正如你所说,命令套接字正在 UI 线程中等待。
      • 我正在使用 VS2008。有没有办法做到这一点?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      相关资源
      最近更新 更多