Form.Invoke замораживает пользовательский интерфейс - PullRequest
2 голосов
/ 11 ноября 2011

Я гулял около часа, и до сих пор не нашел решения.

Я просто пытаюсь установить максимальное значение индикатора выполнения из другого потока. Итак, я нашел метод Control.Invoke. Я иду вперед и реализую это:

enter image description here

Теперь, когда я отлаживаю свое приложение, оно просто застревает в строке this.Invoke. Пользовательский интерфейс появляется, и он заморожен. Так что я собирался сделать это, и он сказал мне использовать this.BeginInvoke(). Я реализовал это, и я был в порядке, пользовательский интерфейс не зависает. Это довольно мило, но на самом деле максимальное значение моего индикатора выполнения не изменилось: (

Что я делаю не так?

РЕДАКТИРОВАТЬ: Может быть, это помогает: я использую Parallel.Invoke(); для управления моей темой ...

Ответы [ 5 ]

5 голосов
/ 11 ноября 2011

Control.Invoke блокируется только при вызове в рабочем потоке и потоке пользовательского интерфейса.

Отправленный вами код верен.Вы, должно быть, блокируете поток пользовательского интерфейса где-то еще.

2 голосов
/ 11 ноября 2011

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

    public void SetMax(int value)
    {
        if (this.ProgressBar_status.InvokeRequired)
        {
           this.BeginInvoke(new Action<int>(SetMax), value);
           return;
        }
        this.ProgressBar_status.Maximum = value;
    }
0 голосов
/ 13 июля 2015

В моем случае ошибка заключалась в использовании join () после запуска потока.join () предотвращает выполнение кода основным потоком до завершения дочернего потока.Я удалил команду join () и переместил коды после join () в поток, и все работало нормально.

0 голосов
/ 26 июня 2013

У меня была та же проблема, и благодаря ответу Николаса я понял, что попал в ту же ловушку в приложении с графическим интерфейсом для отладки класса, используемого в службе Windows. Класс обслуживания выполняет большую часть своего кода в потоке. Поток возвращался к процедуре регистрации, когда он остановился. Я остановил его с помощью кнопки, и журнал использовал invoke для обновления текстового поля. Проблема была настолько проста, что я пнул себя - вызов ждал завершения нажатия кнопки, который ждал остановки класса, который ждал вызова, чтобы записать, что он останавливается (повторять до завершения процесса диспетчера задач). Решается путем создания потока нажатием кнопки остановки, с помощью threadproc, чтобы остановить класс обслуживания. Это означало, что мне пришлось добавить больше кода для обновления формы после остановки в другом вызове из нового потока, но это работало нормально, так как он не ожидал основного потока формы.

0 голосов
/ 11 ноября 2011

Я хотел бы предложить, чтобы лучше использовать фоновый рабочий компонент, который поддерживает создание отчетов о прогрессе в индикаторе выполнения, включая другие функции, а не вызывать invoke и BeginInvoke. Вы можете найти более подробную информацию о фоновом работнике по ссылке ниже MSDN:

http://msdn.microsoft.com/en-us/library/c8dcext2.aspx

...