2

私は昨日この例外に遭遇しました:

Win32Exception:Fehler beim Erstellen des Fensterhandles

翻訳するかもしれません:

Win32Exception:ウィンドウハンドルの作成中にエラーが発生しました

私はこれを解決する方法を知っています(このトピックに関する短いブログ投稿をドイツ語で書いたとしても)

しかし、私のアプリケーションが、ウィンドウハンドルをまだ持っている、破棄されていないコントロールを「リーク」している可能性がある場所はわかりません。

インスタンスを検出/検索する方法はありますか?

  • 埋め込むIDisposable
  • 持ってるParent == null

この制約に一致するオブジェクトは、適切な候補のようです。

4

3 に答える 3

2

適切なメモリプロファイラーであれば、コントロールインスタンスが表示されます。それらはガベージコレクションされません、それらのHandleプロパティはそれらを生き続けます。それらの10,000近くがあります。タスクマネージャで表示することもできます。[表示]+[列の選択]を使用して、[ユーザーオブジェクト]にチェックマークを付けます。アプリをテストしているときにカウントが増えるのを見ると、まともなヒントが得られるはずです。

コードレビューも大いに役立つはずです。ウィンドウをリークする可能性のある方法はそれほど多くありません。最初に、最も一般的なケースである、Controls.Clear()またはControls.Remove / At()を呼び出すが、コントロールを破棄しないコードを探します。次の一般的なケースはSystemEventsクラスであり、そのイベントのサブスクライブを明示的に解除する必要があります。残りは見つけるのがそれほど簡単ではありません、あなたはそのプロファイラーを必要とするでしょう。

Reflectionを使用すると、実行時に自分でハンドルを見つけることが技術的に可能です。ハンドルはSystem.Internal.HandleCollector.handleTypes[]に保存されます。まあ、技術的に。

于 2009-12-14T16:08:15.040 に答える
0

実装するすべてのオブジェクトにIDisposableDisposeメソッドがあります。このメソッドは、オブジェクトが不要になったときに呼び出す必要があります。単一のメソッドでのみ使用されますか、usingステートメントで囲みます(Dispose自動的に呼び出されます)。それがクラスのメンバー変数である場合、クラスはIDisposableそれ自体を実装する必要があります。FxCopには、このためのチェックルールがあります。

于 2009-12-14T14:07:17.920 に答える
0

他のオブジェクトがコントロールを参照しているために収集されない場合は、disposeを呼び出したり、親をnullに設定したりするだけでは不十分です。たぶん、あなたはイベントに執着していて、それらから切り離していません。

特に、アタッチメントに含まれていないコントロールからのイベントにアタッチする場合を確認してください。この場合、コントロールを破棄するときは常にイベントから切り離す必要があります。そうでない場合、コントロールは引き続きアタッチャーによって参照されるため、アタッチされません。解放されます

于 2009-12-14T16:25:31.500 に答える