我有一个C#应用程序,通过它我配置以太网相机的参数。摄像机充当服务器,应用程序充当客户端。
有2个用于通信的插座,一个用于数据/命令通信 - 数据插座(双向通信)和另一个用于图像的插座,摄像机通过图像插座发送图像(单向通信)。每当给出硬件触发时,摄像机将通过图像插座发送图像(当硬件触发器到来时无法预测)。
用户可以通过更改GUI中的值来配置摄像机。当用户更改参数时,应用程序通过命令套接字将命令和数据发送到摄像机并等待响应(接收超时为5秒)。摄像机接收命令并发回响应。 GUI接收它会更新用户已成功更新的内容。
我已将图像套接字放在后台worker中。无限循环内部循环它会在图像套接字中继续轮询图像,每当接收到图像时,它都会显示在GUI中(我使用委托来执行此操作)。一切都很好:))
现在,当触发器进入相机时,它会发送图像。在用户更改参数的同一时刻,应用程序发送命令/数据并等待响应。只有在完全发送图像后,相机才会收到命令。当应用程序等待命令的响应时,后台工作程序(接收映像)没有运行。因此,UI正在等待命令套接字中的响应,并且相机正在图像套接字中发送图像,并且UI不会在后台工作程序未运行时接收图像。它变为死锁,并在命令套接字发生超时(5秒):(。
为什么后台工作程序在套接字等待超时时没有运行? 我用线程替换了后台工作程序,并将优先级设置为最高。错误(超时)频率已降低,但偶尔会出现同样的问题。你们中的任何人都可以帮助我解决这个问题并帮助我理解这个问题。
谢谢, 毗
答案 0 :(得分:1)
我建议您确保用于刷新后台worker的映像的委托是异步调用的(使用BeginInvoke)。同步调用可能会导致互锁。
答案 1 :(得分:0)
在没有看到代码的情况下,我们有点难以理解,但我怀疑这个问题与应用程序UI锁定等待响应有关。
发送命令后,它正在等待哪个线程?如果它的UI线程是一个糟糕的设计 - UI线程不应该等待任何事情。
创建另一个用于通过命令/数据套接字进行通信的线程。用户界面可以简单地将命令放入ConcurrentQueue<T>
或BlockingCollection<T>
。拥有数据套接字的线程将使用来自队列的命令,将它们发送到摄像机,等待最多五秒钟,然后将消息发回UI(使用Invoke)。该线程将序列化对命令/数据套接字的所有访问,以确保任何时候只有一个命令处于活动状态。