2011-02-01 10 views
0

System.Windows.Forms.RichTextBox.ScrollToCaretは、その呼び出し内で追加のイベントを処理する可能性があります。イベントハンドラ内に配置されると、コードは競合状態を引き起こすマルチイベント(マルチスレッドではなく、混乱のような)で実行されるようになります。不足している詳細については、事前に謝罪:TextBox ScrollToCaretがスレッド混乱の原因となる

1)Windowsフォームアプリケーション、.NET C#3.5

2)はキャンバスとリッチテキストボックスを作成し

3)30fpsのでcanvas.Invalidate()を呼び出すワーカースレッドを起動します。

4)キャンバスのOnMouseMove()とPaint()をキャプチャします。

5)OnMouseMove内にRichTextBoxにテキストを追加し、ScrollToCaret()を呼び出します。

6)OnMouseMoveとOnPaintのそれぞれの上部に++、下部に - 静的な短い_eventdepthを使用します。 _eventdepth> 1.スタックトレースの値

7)トラップ:

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

は、この動作は、文書化し、このように動作するようになっている - は、「子」を配布します「GUI」のコールがありますされていますイベント?これを共有すると、他の誰かが時間を燃やし始める場合や、何が起こっているのか誤解している場合に備えて、

---編集---

また、私は今、BeginInvokeメソッドを持つセカンダリスレッドからcanvas.Invalidate(ステップ3)への呼び出しをラップしています。私はまた、ブロックされていない(と私が予想したように)ハングアップするよりもむしろ解決策として追加のイベントを(同じプライマリスレッドで)ディスパッチし始めたときにブロックしていたロックを持っていた。

ScrollToCaret()は、同じスタック内からOnPaint()を呼び出します。どのメソッドが追加のイベントのディスパッチを引き起こす可能性があるのは、Windowsプログラマには明らかですか?

答えて

0

あなたがコントロールを操作するために、Microsoftの勧告に従ったとしても、それはまだあなたの予想外の高いCPU使用率を与えることができますし、原因がRiched20.dllを内部であると思われる(ハング。

をだから私はあなたが単純なテキストボックスを使用することをお勧めまたはWPFに完全に切り替えます。

関連する問題