TextBox ScrollToCaret导致线程混淆

时间:2011-02-01 05:55:12

标签: winforms multithreading events textbox richtextbox

显然,System.Windows.Forms.RichTextBox.ScrollToCaret可以导致在其调用中处理其他事件。当放置在事件处理程序中时,它可以使代码看起来在多重(不是真正的多线程但同样令人困惑)的方式中运行,从而导致竞争条件。提前为遗漏的细节道歉:

1)Windows表单应用程序.NET C#3.5

2)创建Canvas和RichTextBox

3)启动一个以30fps调用canvas.Invalidate()的工作线程。

4)捕获画布的OnMouseMove()和Paint()。

5)在OnMouseMove中,将附加文本附加到RichTextBox并调用ScrollToCaret()。

6)在OnMouseMove和OnPaint的每一个的顶部和 - 底部使用++的静态短_eventdepth。

7)陷阱_eventdepth的值> 1.堆栈跟踪:

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

这种行为是否记录在案并且应该像这样工作 - 是否有“GUI”调用会分发“子”事件?分享这个以防万一其他人开始烧上它或者我误解了什么事情发生。

---编辑---

我现在还使用BeginInvoke从辅助线程包装对canvas.Invalidate(步骤3)的调用。我还有一个锁定,当发生这种情况时,Windows开始派遣其他事件(在同一个主线程中)作为解决方案而不是阻止(并像我期望的那样挂起)。

ScrollToCaret()仍会导致从同一堆栈中调用OnPaint()。对于Windows程序员来说,哪些方法可能会触发其他事件调度?

1 个答案:

答案 0 :(得分:0)

即使您按照Microsoft的建议操作控件,它仍然可以为您提供意外的高CPU使用率并挂起(原因似乎是在riched20.dll中。

所以我建议您使用简单的TextBox或完全切换到WPF。