Индикатор выполнения wpf в 10 раз замедляет связь через последовательный порт - PullRequest
1 голос
/ 23 мая 2010

Я знаю, что это может показаться глупым вопросом, но вот моя проблема. У меня есть рабочий диалог, который «скрывает» фонового работника, поэтому в рабочем потоке я делаю свою работу, я сообщаю о прогрессе стандартным способом, а затем показываю результаты в моей программе WPF. Диалоговое окно содержит просто анимированный GIF и стандартный индикатор выполнения wpf, и когда уведомление о прогрессе, я устанавливаю свойство Value. Все выглядит так, как обычно, и хорошо работает для любых задач, таких как вызовы веб-служб, запросы к базам данных, проработка фона и так далее. Для моей работы мы также используем много «сцепок», кард-ридеров, которые считывают данные со смарт-карты, которые управляются с помощью собственного кода C, который обращается к последовательному порту (поэтому я не использую объект .NET SerialPort). У меня есть несколько тестов на унитаз, и я читаю образец карты за 10 секунд, но, используя свою настоящую программу, в фоновом режиме и показывая диалоговое окно рабочего, мне нужно 1,30 минут, чтобы выполнить ту же работу. Я боролся с проблемой в течение нескольких дней, пока не решил удалить рабочий диалог, и без диалога я получаю те же результаты тестов! Так что я исследовал, и это не диалог, не анимированный GIF, а индикатор выполнения wpf! Просто тот факт, что отображается индикатор выполнения (то есть без анимации, без вызова набора значений, ничего из ничего), замедляет обмен данными через последовательный порт. Выглядит невероятно? Я проверил это поведение, и это именно то, что происходит.

Ответы [ 2 ]

1 голос
/ 23 мая 2010

То, что вы описываете, звучит совершенно нормально. Однократное обновление значения индикатора выполнения является относительно тривиальной задачей, но если ваш код выполняет большое количество операций, то обновление индикатора выполнения каждый раз может в конечном итоге занять гораздо больше общего времени, чем сами операции.

Если ваш код выполняет, скажем, 10 000 операций, попробуйте установить максимальное значение индикатора выполнения на 10 и обновлять панель только через каждые 1000 операций.

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

0 голосов
/ 24 мая 2010

Я всегда использую следующий код для обновления индикаторов выполнения (должен выполняться в потоке пользовательского интерфейса)

private int UpdateCount = 0;

public void UpdateProgress(int value)
{
 // We are updating every tenth time.
 if (((UpdateCount % 10) == 0)) {
  ProgressBar1.Value = value;
 }

 UpdateCount += 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...