2015-12-19 6 views
1

У меня есть RichTextBox, к которому перенаправлена ​​консоль. Консоль Redirector делегирует вызов AppendText() каждый раз, когда консоль записывается. Однако графический интерфейс блокируется при добавлении текста, и поскольку журнал записывается в периоды быстрой последовательности, основной поток/графический интерфейс блокируется до тех пор, пока текст больше не будет добавлен. Есть ли способ разрешить управление формой, когда журнал добавляется из другого потока?Устранение блокировки главного потока при делегировании на GUI

+0

'Консоль Redirector делегирует вызов AppendText() каждый раз, когда консоль записывается в' . Делегат вызвал поток пользовательского интерфейса? – Vikhram

ответ

3

Нет, вы не можете безопасно обновлять пользовательский интерфейс из потока, отличного от UI.

Если у вас есть другой пользовательский интерфейс, который вы хотите сделать, вам нужно будет иметь функцию перенаправления консоли, просто тратите меньше времени на обновление пользовательского интерфейса. Не обновляйте пользовательский интерфейс все время. Будь он буферизовать данные и писать в пользовательский интерфейс реже, или дросселировать вход в консоль, если просто слишком много данных, чтобы отображать все (при этом также выполнять другую необходимую работу).

2

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

Чтобы облегчить некоторые «блокировки», вам нужно попытаться быть «умными».

  • Обновление как можно реже, чтобы управлять этим, используйте какой-то «буфер» для обновления. Возможно, создайте «поддельный» UI-класс (он же модель/DTO), заполнив его данными из вашего потока и выгружайте его в пользовательский интерфейс при необходимости/по требованию/по завершении
  • В делегатах как можно больше. НЕ выполняйте какую-либо форму логики, поскольку это работа, которая заблокирует вас на более длительный период, чем это необходимо.

Я вижу, что вы используете winforms, если это проект, в котором вы находитесь под контролем, а затем перейдите на WPF.

Смежные вопросы