Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Диагностика GUI RichTextBox

Приложение наглухо зависает при входе через RDesktop (стандартный удаленный рабочий стол Windows) на удаленный Windows Server 2008 (вышел, зашел - ого, зависло). Проблема сводится к такому простейшему коду:
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) => { var richTextBox = new RichTextBox();
while (true) { richTextBox.AppendText("a");//источник зла }
}), SynchronizationContext.Current);
richTextBox изначально в дочернем потоке, поэтому InvokeRequired=false, конфликта с GUI не должно быть. Вопрос-в чем может быть проблема, с чего начать диагностику?
Update
еще такой взгляд на проблему:
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) => { var richTextBox = new RichTextBox();
//Thread.Sleep(10000);//вышел-зашел в RDesktop -все нормально richTextBox.AppendText("a");//источник зла Thread.Sleep(10000);//вышел-зашел в RDesktop- приложение виснет
}), SynchronizationContext.Current);
Update 2
Такая же ошибка возникает при экранной заставке (splash screen)
Еще по теме:
Debugging Windows Forms Application Hangs During SystemEvents.UserPreferenceChanged Mysterious Hang or The Great Deception of InvokeRequired Memory Leak in ToolStripTextBoxControl What is UserPreferenceChangedEventHandler in C# winform applications? .NET 4.0 and the dreaded OnUserPreferenceChanged Hang
Изначальная задача
Требуется в отдельном (не основном) потоке сформировать большой RTF. RTF необходим, так как требуется форматирование шрифта (разные размеры шрифта и проч.) Затем сохранить в файл richTextBox.Save(файл.rtf)


Ответ

Лучше сделать поток не в очереди, а напрямую Thread.Start. Добавьте обязательно Application.DoEvent в теле потока. Поток сделать STA

Комментариев нет:

Отправить комментарий