2

私は、RichTextBox.ScrollToCaret でちょっとイライラする障害に遭遇しています。メッセージを RichTextBox に出力するコードがあります。各メッセージがフォームに送信されると、複数の行に分割されて書式設定され、各行が連結され、結果が RichTextBox.Append に送信されます。次に、ボックスの一番下までスクロールするために、次の 2 つの呼び出しが行われます。

outputBox.Select(outputBox.Text.Length, 0);
outputBox.ScrollToCaret();

メッセージを 1 つ印刷する場合は問題ありません。少数のメッセージを印刷する場合は問題ありません。一連のメッセージを立て続けに出力すると、ランダムに (出力される前に出力されるメッセージの数)、AccessViolationException がスローされます ("保護されたメモリを読み書きしようとしました。これは多くの場合、他のメモリが破損していることを示しています。", full詳細はこちら)次回 Append がそのボックスで呼び出され、次のメッセージが追加されます。これは、すばやく連続して行う場合と、毎回 RichTextBox.ScrollToCaret を使用する場合のみ発生します。私がフォールバックした次のコードは正常に動作します。

outputBox.Focus();
outputBox.Select(outputBox.Text.Length, 0);

また、例外をキャッチして破棄しても、次の Append の呼び出しでプログラムがハングすることもわかりました。したがって、RichTextBox の実際のコードに問題があると思います。誰にもアイデアはありますか?

誰かがそれを必要とするなら、もっと多くのコードを投稿できますが、状況は本当に基本的なものです。いくつか注意すべき点は、マルチスレッド (固有の UI スレッド以外) がないため、メッセージを送信するオブジェクトとメッセージを受信するフォームが同じスレッド上にあることです。また、これは .NET 4.0 の下にあります。

この問題に対処するこの他の質問を見つけましたが、回避策のみが提供され、実際の説明はありません: AccessViolation は RichTextBox.ScrollToCaret で発生します。残念ながら、スレッドに関する私の経験は、私が望んでいた場所ではないため、ソリューションを適切に機能させることができませんでしたが、幸いなことに、上に投稿したものはうまく機能します.

更新 1

そのため、XNA と関係があるようにいくつかのテストの後に見えるので、それがスレッドでどのように機能するかについての私の誤解かもしれません。純粋な WinForms アプリではエラーを再現できませんでしたが、単純な XNA ゲームで簡単に再現できました。あなたが見るために、私はここに両方を圧縮しました。エラーについてお詫び申し上げます。 https://dl.dropbox.com/u/16985121/StackOverFlowExamples.zip

4

3 に答える 3

1

ここで別の質問を見つけて、問題を完全に回避して同じ出力を問題なく生成する方法を教えてくれました: https://stackoverflow.com/a/8562457/568042

于 2013-04-15T16:55:24.627 に答える
0
public delegate void WriteLogEntryDelegate(string log_entry);

    void WriteLogEntryCB(string log_entry)
    {
        if (richTextBox1.InvokeRequired == true)
        {
            var d = new WriteLogEntryDelegate(WriteLogEntryCB);
            this.Invoke(d, log_entry);
        }
        else
        {
            richTextBox1.AppendText(log_entry + "\r\n");
            this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length;
            this.richTextBox1.ScrollToCaret();
        }
    }
于 2012-12-25T06:53:31.273 に答える