2011-02-01 80 views
0

顯然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程序員來說顯而易見,哪些方法可能觸發額外的事件派發?

回答

0

即使您按照微軟的建議,操縱控制,它仍然可以給你帶來意想不到的高CPU使用率和掛機(原因似乎是裏面RICHED20.DLL。

所以我建議你用一個簡單的文本框或完全切換到WPF