Этот рабочий поток / фоновый дизайн для приложения C # WPF в порядке? - PullRequest
1 голос
/ 21 июля 2010

Будучи новичком в использовании потоков и т. Д. В пользовательском интерфейсе, могу ли я спросить, выглядит ли следующий простой дизайн в порядке.См. Диаграмму изображение по ссылке здесь

В частности:

a) использование фонового работника и фонового работника ProgressChanged, чтобы агрегатор работал в отдельном потоке.Поэтому мне понадобится собственный класс / тип, в котором есть все данные, которые мне нужно будет передать обратно из потока агрегатора в поток пользовательского интерфейса, который я предполагаю.

b) создать отдельный поток внутри агрегатора, чтобы гарантировать, чтометод обратного вызова SharpPCap / WinPCap находится в другом потоке.Таким образом, этот поток Capture Manager записывает результаты пакета в общий буфер.Здесь я предполагаю, что если код может видеть переменную буфера, то они оба могут получить к ней доступ, независимо от того, в каком потоке они работают?

спасибо

1 Ответ

1 голос
/ 21 июля 2010

У меня есть пара предложений:

Я бы не рекомендовал использовать для этого BackgroundWorker и ProgressChanged.Учитывая, что вы хотите «опрашивать и агрегировать» каждую 1 секунду, я бы рекомендовал просто использовать Timer (вероятно, DispatcherTimer).Вы можете использовать Dispatcher.BeginInvoke для перенаправления вызовов обратно в поток пользовательского интерфейса, если этот запуск выполняется в отдельном потоке (при желании вы также можете использовать таймер на основе пользовательского интерфейса).

Я бы рекомендовал использовать ConcurrentQueue<T> для хранения ваших пакетных данных вместо списка.Это предотвратит блокировку вашего списка.Если вам нужно придерживаться версий .NET <4, вы можете использовать <code>List<T>, но вам нужно будет синхронизировать доступ к нему (блокировка какого-либо объекта для защиты операций чтения / записи в списке).Оба потока смогут использовать одну и ту же коллекцию при условии, что она безопасна для потоков или правильно синхронизирована.

...