У меня есть приложение C#, с помощью которого я настраиваю параметры камеры Ethernet. Камера действует как сервер, а приложение — как клиент.
Есть 2 разъема для связи, один для передачи данных/команд - разъем данных (двусторонняя связь) и другой разъем для изображения, камера отправляет изображение через разъем изображения (односторонняя связь). Камера будет отправлять изображение через сокет изображения всякий раз, когда ей дается аппаратный триггер (непредсказуемо, когда придет аппаратный триггер).
Пользователь может настроить камеру, изменив значения в графическом интерфейсе. Когда пользователь изменяет параметр, приложение отправляет команду и данные на камеру через командный сокет и ожидает ответа (время ожидания приема составляет 5 секунд). Камера получает команду и отправляет ответ обратно. Графический интерфейс получает обновления пользователя, который успешно обновился.
Я поместил сокет изображения в фоновый рабочий. Бесконечный цикл while внутри него продолжает опрашивать изображение в сокете изображения, и всякий раз, когда изображение получено, оно отображается в графическом интерфейсе (я использую для этого делегат). Все хорошо :)
Теперь, когда на камеру придет триггер, она отправит изображение. В тот же момент пользователь изменяет параметр, приложение отправляет команду/данные и ждет ответа. Камера получит команду только после полной отправки изображения. Что происходит, так это то, что фоновый рабочий (который получает изображение) не работает, когда приложение ожидает ответа на команду. Таким образом, пользовательский интерфейс ожидает ответа в командном сокете, а камера отправляет изображение в сокет изображения, а пользовательский интерфейс не получает изображение, поскольку фоновый рабочий процесс не запущен. Это становится тупиком, и в командном сокете происходит тайм-аут (5 секунд) :(.
Почему фоновый рабочий не работает, когда сокет ожидает истечения времени ожидания? Я заменил фонового рабочего потоком и установил наивысший приоритет. Частота ошибок (тайм-аутов) снизилась, но время от времени возникает та же проблема. Может ли кто-нибудь из вас, ребята, помочь мне разобраться в этом и помочь мне понять проблему.
Спасибо, Вишну