36

私たちは非常に大規模な .NET WinForms 複合アプリケーションに取り組んでいます - CAB ではなく、同様の自家製フレームワークです。Windows Server 2003 で実行されている Citrix および RDP 環境で実行しています。

アプリケーションで昔ながらのハンドル リークのように思われる、ランダムで再現が難しい「ウィンドウ ハンドルの作成中にエラーが発生しました」というエラーが発生し始めています。サード パーティのコントロール (Janus GridEX、Infralution VirtualTree、.NET Magic ドッキング) を多用しており、データベースのメタデータに基づいてコンテンツの動的な読み込みとレンダリングを数多く行っています。

このエラーに関する情報は Google にたくさんありますが、この分野の問題を回避する方法についての確かなガイダンスはあまりありません。

スタックオーバーフロー コミュニティには、ハンドルに適した winforms アプリを構築するための適切なガイダンスがありますか?

4

9 に答える 9

33

WinFormsで期待どおりにUIがアンロードされないという多くの問題を追跡しました。

一般的なヒントは次のとおりです。

  • 多くの場合、コントロールイベントが適切に削除されていない(ツールチッププロバイダーがここで非常に大きな問題を引き起こした)か、コントロールが適切に破棄されていないため、コントロールは使用されたままになります。
  • すべてのモーダルダイアログの周りに「using」ブロックを使用して、それらが破棄されるようにします
  • 必要になる前にウィンドウハンドルの作成を強制するいくつかのコントロールプロパティがあります(たとえば、TextBoxコントロールのReadOnlyプロパティを設定すると、コントロールが強制的に実現されます)
  • .Netメモリプロファイラーなどのツールを使用して、作成されたクラスの数を取得します。このツールの新しいバージョンでは、GDIオブジェクトとUSERオブジェクトも追跡されます。
  • Win API呼び出し(または他のDllImport呼び出し)の使用を最小限に抑えるようにしてください。相互運用機能を使用する必要がある場合は、using/Disposeパターンが正しく機能するようにこれらの呼び出しをラップしてみてください。
于 2008-09-18T00:44:28.510 に答える
5

無限ループが新しい UI コントロールを作成し、そのプロパティを設定したため、この例外に遭遇しました。何度もループした後、コントロールの表示プロパティを変更すると、この例外がスローされました。ユーザー オブジェクトと GDI オブジェクト (タスク マネージャーから) の両方が非常に大きいことがわかりました。

あなたの問題は、これらのUIコントロールによってシステムリソースが使い果たされるという同様の理由だと思います。

于 2012-01-13T07:12:31.410 に答える
4

私は仕事でJanusControlsを使用しています。彼らは彼ら自身を処分する限り非常にバグがあります。それらが正しく廃棄されていることを確認することをお勧めします。また、それらとのバインドが解放されない場合があるため、コントロールを破棄するには、オブジェクトを手動でバインド解除する必要があります。

于 2008-09-18T00:47:39.953 に答える