2015-04-17 2 views
0

Я создал приложение WinForms, которое использует BackgroundWorker. Методы в BackgroundWorer выводят сообщения в RichTextBox. Обработчик события _TextChanged прокручивается до конца RichTextBox.Исключение: (RPC_E_CANTCALLOUT_ININPUTSYNCCALL) при использовании приложения WinForms

Теперь проблема заключается в том, что я получаю

необработанное COMException: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL)

когда RichTextBox.ScrollToCaret() вызывается из обработчика события _TextChanged. В чем может быть проблема? Как решить эту проблему?

+0

ли иметь доступ к RichTextBox непосредственно из BackgroundWorker? –

+0

Доступ к элементам управления из другой нити, кроме потока пользовательского интерфейса, строго запрещен. Большинство элементов управления имеют явные проверки и будут вызывать исключение, когда оно обнаружит эту ситуацию, возможно, RichTextBox этого не делает. Вам необходимо маршалировать обработку richtextbox в потоке пользовательского интерфейса, используя 'Invoke' из вашего backgroundthread. См. Https://msdn.microsoft.com/en-us/library/ms171728%28v=vs.85%29.aspx –

+0

@ LasseV.Karlsen: Да. RichTextBox обновляется с BackgroundWorker. Спасибо за ссылку. – CDP21

ответ

0

Как вы уже упоминали в комментариях, вы получаете доступ к RichTextBox непосредственно из рабочего стола.

Доступ к элементам управления пользовательского интерфейса из нескольких потоков строго запрещен. Только пользовательский интерфейс должен получить доступ к элементам управления.

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

Вы можете сделать это в вашем BackgroundWorker кода:

Invoke(new Action(() => 
{ 
    // code that manipulates the RichTextBox here 
})); 
+0

спасибо, что решила проблему. – CDP21