顯然System.Windows.Forms.RichTextBox.ScrollToCaret可能導致其他事件在其調用中被處理。當放置在一個事件處理程序中時,它可以使代碼看起來像multievent(不是真正的多線程,但同樣令人困惑)時尚運行造成競爭條件。提前道歉失蹤的細節:TextBox ScrollToCaret導致線程混淆
1)Windows窗體應用程序.NET C#3.5
2)創建一個Canvas和RichTextBox的
3)啓動輔助線程,在30fps的調用canvas.Invalidate() 。
4)捕獲畫布的OnMouseMove()和Paint()。
5)在OnMouseMove追加附加文本到RichTextBox並調用ScrollToCaret()。在每個的OnMouseMove和OnPaint中的底部 -
6)使用該++在頂部和一個靜態短_eventdepth。
7)當_eventdepth> 1.堆棧跟蹤的價值陷阱:
Canvas::OnPaint()
[External Code]
Canvas::OnMouseMove(), scrollToCaret() is within
這種行爲記錄在案,並認爲這樣的工作 - 在有「GUI」調用,將分發「孩子」事件?如果其他人開始在上面燃燒時間,或者我誤解了發生的事情,請分享此信息。
--- ---編輯
我現在也包裹調用canvas.Invalidate從與BeginInvoke的次級線程(步驟3)。我也有一個鎖,當發生這種情況時,窗口開始派發額外的事件(在同一主線程中)作爲解決方案而不是塊(並且像我預期的那樣掛起)。
ScrollToCaret()仍然會導致OnPaint()從同一個堆棧中調用。這對Windows程序員來說顯而易見,哪些方法可能觸發額外的事件派發?