Как буферизовать вывод из .net BackgroundWorker? - PullRequest
0 голосов
/ 25 июня 2009

У меня есть поток данных, поступающих из внешнего источника, который я сейчас собираю в BackgroundWorker. Каждый раз, когда он получает другую порцию данных, он представляет эти данные в графический интерфейс с помощью вызова ReportProgress().

У меня складывается впечатление, что функция ProgressChanged - это всего лишь механизм синхронизации, хотя, когда мой рабочий поток вызывает это, оба потока блокируются, пока поток GUI обрабатывает изменение. Поэтому я думаю, что проблема в том, что в то время как фоновый поток обновляет графический интерфейс, он не может принимать какие-либо данные, что означает, что мы теряем несколько пакетов. Это верно, или мой пакет, скорее всего, потерял работу в другом месте?

Если это является причиной, то будет ли разумным решением добавить второй поток для обновления GUI или есть более эффективные / более тщательные способы решения этих проблем, в которые я должен вникнуть?

Любые мысли и предложения будут приветствоваться.

Ответы [ 2 ]

0 голосов
/ 25 июня 2009

Рабочий поток просто отправляет асинхронное сообщение в поток графического интерфейса, что приведет к возникновению события в графическом интерфейсе. Это не должно останавливать ваш фоновый поток (и это в любом случае не должно иметь значения. Ваша программа с графическим интерфейсом может долго останавливаться, если пользователь решит запустить другую программу и т. Д.)

Вы не говорите о том, какой поток вы используете. Поэтому, если вы не получаете дейтаграммы UDP, которые в любом случае ненадежны, здесь не должно быть потери данных. Поток непрерывный.

0 голосов
/ 25 июня 2009

Возможно, вам придется создать объект SynchronizationContext в потоке графического интерфейса, чтобы можно было использовать его метод Post для асинхронной отправки сообщений из вашего BackgroundWorker.

...