2

EDIT 11-20-2009 : この質問はかなり前に投稿されましたが、今朝、問題が再び発生しました。ですから、他の誰かが何らかの洞察を提供してくれることを願っています(ただし、提供された回答はすでに役に立ちました)。

実稼働環境でブルームーンに入ると、コントロールのプロパティをNullReferenceException参照することから取得します。以下にいくつかのサンプルコードを含めました。ItemsListBox

問題の の親フォームは、というListBoxプライベートを保持しています。このキューは、イベントに関する新しいメッセージを受け取ります。500 ミリ秒ごとにオフになるタイマーでは、次のメソッドが実行されます。Queue<string>QueuedMessages

void DisplayQueuedMessages() {
    lock (QueuedMessages) {
        while (QueuedMessages.Count > 0) {
            string msg = QueuedMessages.Dequeue();
            this.lbxMessages.Items.Insert(0, msg); // NullReferenceException
            if (this.lbxMessages.Items.Count > MAX_LBX_ITEMS) {
                this.lbxMessages.Items.RemoveAt(Me.lbxMessages.Items.Length - 1);
            }
        }
    }
}

繰り返しますが、私が述べたように、これはめったにスローしNullReferenceException ません。アプリケーションを使用して数か月で、それは 3 ~ 4 回発生しました。

さらに、これが数回発生した場合、ListBox.ItemsプロパティまたはListBoxそれ自体のいずれかが不思議なことに消えてしまったようです。項目を追加する後続のすべてのメソッドはListBox例外をスローします。回復する唯一の方法は、アプリケーションを閉じて元に戻すことです。

残念ながら、他に何百万ものやるべきことに常に気を取られていたので、挿入の前にログを追加することはできませんでした。現在、ログを追加しましたが、この問題が再び発生するまでには 1 か月以上かかる可能性があります。それまでの間、他にアイデアはありますか?これについて考えられる説明は何ですか?

私の本当の質問は次のとおりだと思います:他の誰かがこれが起こるのを見たことがありますか?存在しListBoxいたにアクセスして突然 を取得しましたNullReferenceException?そして、問題を解決する理由/方法を理解できましたか?

4

4 に答える 4

2

すべてのコードを詳しく調べてください。Me.ListBox1 が null である可能性が非常に高いです。

私はかつて、このようなコードが特定のケースでのみ呼び出され、asp.net レンダリング コード中に例外を引き起こした、サード パーティによって作成されたアプリに取り組んでいました ...

void ClearItems()
{
   SomeField.Text = "";
   ...
   AnotherField = null; 
   ...
}

他のエラーのスタック トレースにも注意してください。コントロールのメソッド内でエラーが発生した場合と、コード内でエラーが発生した場合は異なります。

于 2009-09-21T20:11:46.333 に答える
1

原因は、今朝私が特定したSystem.Windows.Form v2.0のバグです(これはSystem.Windows.Form v4.0で修正されています)。

私にとっては、ホスティングプロセスがシャットダウンしている間にコードがにを追加しているときに発生しItemました。ListBoxプライベートインスタンスフィールドListBox.listItemsArrayはnullであり、これにより。が発生しNullReferenceExceptionます。ListBox.listItemsArrayなぜnullなのか正確にはわかりませんが、ハンドル作成の問題に関連していると思います。

try/catchとにかくプロセスがシャットダウンしているので、aで十分だったので、私にとって回避策は簡単でした。私が行ったように、リフレクター機能の逆コンパイルで問題を掘り下げることができます。

ここに画像の説明を入力してください

于 2011-10-14T10:36:19.177 に答える
1

まず、条件付きブレークポイントを設定して、保護コードを見つけたり、書いたりしてみてください。コードの前に tis のようなものを追加します。

System.Diagnostics.Debug.Assert(Me.ListBox1 != null);
System.Diagnostics.Debug.Assert(Me.ListBox1.Items != null);
String msg = getStatusMessage(); 
System.Diagnostics.Debug.Assert(msg != null);
Me.ListBox1.Items.Insert(0, msg);

(ここでは VB と C# を混在させていると思いますが、全体像がわかります。)

また、SelectedIndexChanged または同様のイベントで null 例外が実際に発生していないことを確認してください。

しかし、実際には ListBox の問題である可能性があります。この質問を参照してください。

于 2009-09-21T20:38:53.673 に答える
1

Me.ListBox1それが null になっていないことをどの程度確信していますか? それが私の最初の推測です。

于 2009-09-21T20:04:32.383 に答える