0

一部のクライアント マシンでは、このSystem.ComponentModel.Win32Exception: The operation completed successfully というエラーが発生します。これは、明らかにリソースのリークまたはプロセスあたり 10000 ハンドルのハード リミットに達していることを示しています。

コードを調べてリファクタリングしていますが、ウィンドウを作成するために使用しているパターンは(簡略化されています)

class MyForm : Form
{
  public MyForm()
  {
    InitializeComponents()
  }

  //windows generated code
  public void InitializeComponents()
  {
      myButton = new System.Windows.Forms.Button();
      myButton.Click += new System.EventHandler(myButton1_Click);
  }

  private void button1_Click(object sender, EventArgs e)
  {
      Dispose();
  }
}

//this will be called many times throughout the programs lifecycle
Form myForm = new Form()
myForm.ShowDialog();

ウィンドウが表示されるたびにボタンを再構築すると (実際には多数のコンポーネントがあります)、ハンドルで問題が発生する可能性がありますか? dispose は意味がないと思っていましたが、問題を引き起こしている可能性のある他のコード セクションを見つけるのに苦労しています。

4

2 に答える 2

2

pinsサブスクリプションがまだアクティブであるため、ガベージ コレクションが行われないように、インスタンスのサブスクリプションをサブスクライブ解除する必要があります。

于 2013-11-07T00:08:41.303 に答える
1

フォームをモーダル フォームとして表示していない場合は、Dispose ではなくフォームで Close() を呼び出す必要があります。Close は、フォームを閉じてから、モーダル フォームでない場合は自動的に破棄します。フォームがモーダルの場合は、引き続き Close() を呼び出す必要がありますが、後で Dispose() も呼び出す必要があります。

スキップする Win32 呼び出しが多数あるため、完了したフォームでは常に Close() を呼び出す必要があります。それ以外の場合は、Windows フォーム アプリケーションのライフサイクルの通常の部分です。

于 2013-11-07T00:10:46.297 に答える