1

AccessViolationException特定IEnumerable<>の類似オブジェクトが使用されたときに生成される LCG を使用した .Net 2.0 にバグがあることは承知しています。そして、修正プログラムがあること。

Windows 7 x64で実行されているWinFormsを使用して.Net 4.0にプロジェクトがあります。RichTextBox私は非常に単純なフォームを持っています -クライアント全体のサイズを占めるフォームとドックだけです。

バックグラウンド スレッドから、次のような処理を行うフォームの更新メソッドを定期的に呼び出します。

public static void Log(string text)
{
  Invoke((MethodInvoker)(() => {
    lock(richTextBox) {
      richTextBox.Text += text;
    }   
  }));
}

実際にはinvoke、try/catch の内側と外側の両方を持っています (はい、これは恐ろしいことだと思います!)。キャレットを最後に置いてスクロールするなど、いくつかの追加処理を行っています。私も使用してStringBuilderいますが、これはすべて要点です:

まれに、しかし必然的に、デバッグ中に IDE がAccessViolationExceptionテキスト ボックスを更新しているコードのどこかを検出します。テキストを更新するビットである場合もあれば、選択を行うビットである場合もあり、キャレットまでスクロールするビットである場合もあります。F5 キーを押して続行すると、通常はしばらく問題が発生せず、アプリケーションは以前と同じように続行します。

このテキスト ボックスでは特別なことは何も起こりません。競合状態はありません (まず第一に、私はロックを持っているため) だけでなく、他の何かが試みているのと同時にテキスト ボックスに書き込もうとするコードがコードに何もないためです。

なぜこれが起こっているのでしょうか?申し訳ありませんが、そもそもなぜこれが起こっているのかさえわからないため、ここに他にどのような情報を記載できるかわかりません.

4

1 に答える 1

0

コードの残りの部分が何をしているのかわかりませんが、lock(richTextBox) に問題があると思います。GUI スレッドが RichTextBox で何かを実行している場合、または他のスレッドでこの RichTextBox にアクセスしている場合、ロックは機能しません。

于 2013-03-18T04:08:55.660 に答える