TextBox ScrollToCaret вызывает путаницу потоков - PullRequest
0 голосов
/ 01 февраля 2011

Очевидно, System.Windows.Forms.RichTextBox.ScrollToCaret может вызывать обработку дополнительных событий в рамках его вызова.Помещенный в обработчик событий, он может заставить код работать многоэтапным образом (не многопоточным, а столь же запутанным), вызывая условия гонки.Заранее извиняюсь за отсутствующие детали:

1) Приложение Windows Form .NET C # 3.5

2) Создание Canvas и RichTextBox

3) Запуск рабочего потока, который вызывает canvas.Invalidate () со скоростью 30 кадров в секунду.

4) Захватите OnMouseMove () и Paint () для холста.

5) В OnMouseMove добавьте текст добавления к RichTextBox и вызовите ScrollToCaret ().

6) Используйте статический короткий _eventdepth, который ++ вверху и - внизу каждого из OnMouseMove и OnPaint.

7) Поймать, когда значение _eventdepth> 1. Stack Trace:

   Canvas::OnPaint()
   [External Code] 
   Canvas::OnMouseMove(),  scrollToCaret() is within

Задокументировано ли это поведение и должно ли оно работать следующим образом - существуют ли вызовы "GUI", которые будут распространять "дочерние" события?Обмен этим в случае, если кто-то еще начинает записывать время или если я неправильно понимаю, что происходит.

--- edit ---

Я также теперь обернул вызов canvas.Отменить (шаг 3) из вторичного потока с BeginInvoke.У меня также была блокировка, которая блокировала, когда это происходит, Windows начинает отправлять дополнительные события (в том же основном потоке) как решение, а не блокировать (и зависать, как я и ожидал).

ScrollToCaret ()по-прежнему вызывает OnPaint () из того же стека.Для программистов Windows просто очевидно, какие методы могут вызывать дополнительные отправки событий?

1 Ответ

0 голосов
/ 06 февраля 2011

Даже если вы следуете рекомендациям Microsoft по манипулированию элементом управления, он все равно может привести к неожиданно высокой загрузке ЦП и зависанию (причина, похоже, находится внутри riched20.dll.

Поэтому я предлагаю вам использовать простой TextBox или полностью переключиться на WPF.

...