Приложение наглухо зависает при входе через 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
Комментариев нет:
Отправить комментарий