Фоновый работник не работает - PullRequest
1 голос
/ 01 февраля 2011

У меня есть приложение C #, с помощью которого я настраиваю параметры камеры Ethernet. Камера действует как сервер, а приложение - как клиент.

Имеется 2 гнезда для связи, одно для передачи данных / команд - гнездо данных (двухсторонняя связь) и другое гнездо для изображения, камера отправляет изображение через гнездо изображения (односторонняя связь). Камера отправляет изображение через гнездо изображения всякий раз, когда ему дается аппаратный триггер (не предсказуемо, когда произойдет аппаратный триггер).

Пользователь может настроить камеру, изменив значения в графическом интерфейсе. Когда пользователь изменяет параметр, приложения отправляют команду и данные на камеру через командный сокет и ждут ответа (Тайм-аут приема составляет 5 секунд). Камера получает команду и отправляет ответ обратно. GUI получает, что он обновляет пользователя, который успешно обновил.

Я поместил сокет изображения в фоновый рабочий. В бесконечном цикле while он опрашивает изображение в сокете изображения, и всякий раз, когда изображение получено, оно отображается в графическом интерфейсе (для этого я использую делегата). Все хорошо :) 1007 *

Теперь, когда на камеру пришел триггер, он отправил изображение. В тот же момент, когда пользователь изменяет параметр, приложение отправляет команду / данные и ожидает ответа. Камера получит команду только после полной отправки изображения. Что происходит, так это то, что фоновый работник (который получает изображение) не работает, когда приложение ожидает ответа на команду. Итак, пользовательский интерфейс ожидает ответа в командном сокете, а камера отправляет изображение в графический сокет, а пользовательский интерфейс не получает изображение, так как фоновый рабочий не запущен. Это становится тупиком, и время ожидания (5 секунд) происходит в командном сокете: (.

Почему фоновый работник не работает, когда сокет ожидает тайм-аут? Я заменил фоновый рабочий потоком и установил приоритет как самый высокий. Частота ошибки (тайм-аута) снизилась, но иногда возникает та же проблема. Любой из вас, ребята, может помочь мне разобраться в этом и помочь мне понять проблему.

Спасибо, Вишну

Ответы [ 2 ]

1 голос
/ 01 февраля 2011

Я бы посоветовал вам убедиться, что делегат, используемый для обновления изображения из фонового работника, вызывается асинхронно (используя BeginInvoke).Синхронный вызов может вызвать блокировку.

0 голосов
/ 01 февраля 2011

Не видя код, это немного сложно понять, но я подозреваю, что проблема связана с блокировкой пользовательского интерфейса приложения в ожидании ответа.

Какой поток ожидает после отправки команды?Если поток пользовательского интерфейса имеет плохой дизайн - потоку пользовательского интерфейса больше не нужно ничего ждать.

Создайте другой поток, который будет использоваться для связи через сокет команды / данных.Пользовательский интерфейс может просто помещать команды в ConcurrentQueue<T> или BlockingCollection<T>.Поток, которому принадлежит сокет данных, будет принимать команды из очереди, отправлять их на камеру, ждать до пяти секунд и затем отправлять сообщение обратно в пользовательский интерфейс (используя Invoke).Этот поток будет сериализовать весь доступ к сокету команды / данных, чтобы гарантировать, что одновременно активна только одна команда.

...