显然,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程序员来说,哪些方法可能会触发其他事件调度?
答案 0 :(得分:0)
即使您按照Microsoft的建议操作控件,它仍然可以为您提供意外的高CPU使用率并挂起(原因似乎是在riched20.dll中。
所以我建议您使用简单的TextBox或完全切换到WPF。