Ошибка ScrollToCaret в WinForms?
У меня есть сервер, который обрабатывает сообщения, сервер, который разрешает связь в стиле IRC.
Я работаю над графическим интерфейсом WinForms, который взаимодействует с сервером.
В графическом интерфейсе WinForms есть компонент, который выполняет чтение / запись в newtork. Этот компонент запускает поток для непрерывного чтения (получения) в сокете. Этот поток принимает делегат, который позволяет обрабатывать прочитанное сообщение сразу, а не помещать во внутреннюю очередь чтения, встроенную в компонент. Тогда у меня есть основная форма, которая показывает сообщения чата, полученные и отправленные, среди прочего. Сообщения чата хранятся в RichTextBox. Обновление журнала чата осуществляется методом основной формы:
private void UpdateChatWindow(string text)
{
lock (rtxt_msgLog)
{
rtxt_msgLog.Text += Environment.NewLine + text;
rtxt_msgLog.SelectionStart = rtxt_msgLog.Text.Length;
rtxt_msgLog.ScrollToCaret();
}
}
Вышеуказанный метод вызывается из основной формы, а также из потока, который выполняет непрерывное чтение сокета.
Если у меня открыто одно окно с графическим интерфейсом, msgLog обновляется нормально, прокручивается вниз. Focus () не является проблемой, так как RichTextBox никогда не находится в фокусе, как указано в свойстве Focused, которое всегда возвращает «false».
Звезды странности, когда я запускаю второй графический интерфейс и захожу на сервер. Я начинаю получать
на первом графическом интерфейсе, который запускается, когда я выполняю отправку с него, в то время как второй графический интерфейс работает нормально - получает сообщение, отправленное с первого графического интерфейса, корректно прокручивается до нижней части msgLog. После того, как я отправил несколько сообщений в графическом интерфейсе ошибки, ошибка перестает возникать в первом графическом интерфейсе и переходит ко второму графическому интерфейсу. Теперь я получаю сообщение об ошибке при попытке отправить MSG на второй графический интерфейс. Пока все это происходит. Когда я отправляю сообщение о первом (теперь это не GUI с ошибкой), оба GUI прокручиваются так, как должны. Но когда я отправляю сообщение об ошибке в графическом интерфейсе ошибки, ни один из графических интерфейсов не прокручивается, но они получают сообщение.
Интересно, что Ошибка никогда не возникает при записи полученного сообщения в msgLog, в котором также используется метод UpdateChatWindow, запущенный из потока компонентов, о котором я упоминал в начале. Отправка инициируется в главной форме, поэтому отдельный поток от потока запускается сетевым компонентом чтения / записи.
После ввода этого поста я вернулся к своим открытым графическим интерфейсам и в следующие несколько попыток ошибка перепрыгивала между графическими интерфейсами, однажды обнаруживаясь на первом графическом интерфейсе, затем на втором, затем снова на первом, наконец, он вернулся на второй графический интерфейс и остается там. Пока ошибка переходила между графическими интерфейсами, один графический интерфейс прокручивался, а другой - нет, что также изменялось в зависимости от места возникновения ошибки.
Я видел что-то на этом сайте, что могло бы объяснить это. Является ли причина моей странности связана с:
«Вы не можете напрямую выполнять операции пользовательского интерфейса из другого потока, кроме основного потока пользовательского интерфейса»
Или есть что-то еще?
По-видимому, в моей системе есть некоторые конфликты, WinXP SP2 64bit. Возможно, даже связано с моими многочисленными установленными средами .Net. Графический интерфейс работает без помех на моем ноутбуке WinXP SP3 32bit. Имейте 3 открытых окна, и все работают без нареканий. Как только я открываю графический интерфейс на своем компьютере разработчика, присоединяюсь к тому же серверу, на котором включены 3 графических интерфейса ноутбука, новый графический интерфейс получает эту ошибку, в то время как графический интерфейс ноутбука все еще в порядке. Напечатано в моей проблеме в Google, и по результатам видно, что это может быть проблема конфигурации системы, и выглядит так: (