Очевидно, 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 просто очевидно, какие методы могут вызывать дополнительные отправки событий?