2

現在、.NET アプリケーションの有線の問題をデバッグしています。特定のサーバー イベントへの反応として、フォームとコントロールを動的にプラグインします。もちろん、サーバーとの通信はスレッドで行われます。すべての UI 要素は、コントロールの呼び出しメカニズムを介して操作されます。

それでもクロススレッド例外が発生します。一部の子コントロールでは、親の InvokeRequired プロパティは false ですが、InvokeRequired プロパティは true です。したがって、これらの子はメイン スレッドの外で作成されたに違いありません。現在、この誤ったコントロールの作成につながる可能性のあるスレッドを探しています。Visual Studio のスレッド ビューのスクリーンショットでわかるように、"mainX" と呼ばれる多数のワーカー スレッド (これらはほんの一部です) があり、それらがどこから来たのかわかりません。

これは、「古い」メインスレッドの標準的な命名パターンですか? たぶん - わからない - Application.Run などの複数の呼び出しが原因でしょうか?

有線ワーカー スレッド

どんなアドバイスでも大歓迎です!

編集(要約すると)
InvokeRequired == false のルート コントロールと InvokeRequired == true の子コントロールがあります。それはどのように可能ですか?root.Controls.Add(child) はすでに例外をスローしているはずです。

スクリーンショットに示されているスレッドの命名パターンにつながる理由を知っている人はいますか?

4

1 に答える 1

3

コントロールがハンドルを作成する前に、コントロールの InvokeRequired プロパティを何らかの方法でチェックしていると思われます。これを行うと、別のスレッドであっても、InvokeRequired は false を返します。

これは、Control.IsHandleCreated を調べることで確認できるため、少なくともこれが起こっているかどうかを確認できます。それが実際に起こっていることである場合、それを修正することは別のことですが...

于 2012-11-29T12:39:01.340 に答える