Я не уверен, что Control.Invoke
- лучший выбор для обновления пользовательского интерфейса.Я не могу сказать точно в вашем случае, потому что я не знаю обстоятельства, при которых UpdateSummary
в призвал.Однако, если вы периодически вызываете его как механизм для отображения информации о ходе выполнения (это впечатление, которое я получаю из фрагмента кода), тогда есть обычно лучший вариант.Этот вариант заключается в проведении опроса потока пользовательского интерфейса для статуса вместо того, чтобы рабочий поток выдвигал его.
Причины, по которым подход опроса должен рассматриваться в этом случае, заключаются в следующем:
- Это нарушает тесную связь между пользовательским интерфейсом и рабочими потоками, которые навязывает
Control.Invoke
. - Это возлагает ответственность за обновление потока пользовательского интерфейса на поток пользовательского интерфейса, где он должен принадлежать в любом случае.
- Поток пользовательского интерфейса получает указание, когда и как часто должно происходить обновление.
- Нет риска переполнения насоса сообщений пользовательского интерфейса, как в случае с методами маршалинга, инициированными рабочим потоком.
- Рабочему потоку не нужно ждать подтверждения того, что обновление было выполнено, прежде чем переходить к следующим шагам (т. Е. Вы получаете большую пропускную способность как для пользовательского интерфейса, так и для рабочих потоков).
Поэтому подумайте о создании System.Windows.Forms.Timer
, который периодически проверяет текст, отображаемый на Control
, а не инициируеттолчок из рабочего потока.Опять же, не зная ваших точных требований, я не хочу определенно указывать направление, в котором вы должны идти, но в большинстве во многих случаях это на лучше, чем опция Control.Invoke
.
Очевидно, что этот подход полностью исключает необходимость проверки InvokedRequired
.Не имеет значения, тот факт, что он упрощает все другие аспекты взаимодействия пользовательского интерфейса / рабочего потока.