Я не знаю Pcapdot.net, но я знаю Winforms, поэтому я могу дать вам пару советов.
Похоже, что ваш пользовательский интерфейс застрял в том смысле, чтоокно не отвечает (вы не можете нажимать активные кнопки или редактировать текстовые поля, и при попытке окно становится серым).В этом случае у вас есть проблема с многопоточностью.Я не знаю, является ли BackgroundWorker
библиотечным классом или классом, который вы создали, но вы должны быть уверены, что любая операция ввода-вывода выполняется в другом потоке.Хотя название предполагает, что это происходит, я не уверен, как вы начнете процесс против того, что предполагается API.Например, некоторые библиотеки позволяют вам вызывать метод start
, который разветвляет другой поток, в то время как другие требуют, чтобы вы вызывали метод execute
из потока, который вы уже разветвили.Это имеет значение.
Чтобы обновить пользовательский интерфейс из потока, не являющегося пользовательским интерфейсом, вы всегда должны использовать метод [Control.Invoke][1]
(если вам нужно приостановить поток до обновления пользовательского интерфейса) или Control.BeginInvoke
(еслиВы хотите продолжить как можно скорее).
Мой Lambda-fu
не тренируется ежедневно, поэтому, пожалуйста, исправьте меня, если я сделаю ошибку в моем синтаксисе
progressBar1.Invoke(delegate() {progressBar1.Value = e.ProgressPercentage;});
Во втором случаев котором ваш пользовательский интерфейс застрял в том смысле, что индикатор выполнения не будет прогрессировать, сначала убедитесь, что событие запущено.Второе и самое важное, вы не можете обновить пользовательский интерфейс из не-пользовательского потока.Обязательно!
Если вы запускаете этот метод progressChanged
внутри try-catch, я вижу проблемы, потому что когда вы обновляете процент progressBar, вы получаете исключение, которое может быть замаскировано.Я также надеюсь, что ProcessPercentage
- это целое число в диапазоне от 0 до 100, а не double
в диапазоне от 0 до 1, что приводит к тому, что планка, по-видимому, не прогрессирует.