質問

複数のスレッドがあります(a, b, c など)その事実について クリア().NETコンポーネントコンテナのアイテムは 廃棄 それら(紛争を呼び出すことによって(真実).

最も頻繁に、iMho、クリアEDコンポーネントはアプリケーションではもはや使用されていないため、親コンテナからそれらをクリアした後、明示的に処分する必要があります。

たぶん、コレクションの良い考えでしょう Clear メソッドにはブールパラメーターがありました dispose リストから削除する前にコレクション要素も処分するときは?

役に立ちましたか?

解決

このような変更を求めることは無意味で、Windowsフォームチームはかなり前に解散しました。メンテナンスモードであり、セキュリティの問題とOSの非互換性のみが考慮されます。

それ以外の場合は、これを行うための独自の方法を作成するのに十分単純です。

  public static class ExtensionMethods {
    public static void Clear(this Control.ControlCollection controls, bool dispose) {
      for (int ix = controls.Count - 1; ix >= 0; --ix) {
        if (dispose) controls[ix].Dispose();
        else controls.RemoveAt(ix);
      }
    }
  }

今、あなたは書くことができます:

  panel1.Controls.Clear(true);

他のヒント

「リスクとは何か」という質問に答えると、リスク(またはリスク)はウィンドウハンドルがなくなっていますが、しばらく時間がかかります。

スクリプトからウィンドウを生成する「ウィンドウデザイナー」があります。スクリプトを変更するたびに、ウィンドウが再構築されます(コントロールがクリアおよび読み取りされます)。特に複雑なウィンドウがあり、使用しています Controls.Clear() 毎回、数十のリフレッシュの後、最終的には「これ以上のウィンドウハンドル」例外が得られ、これ以上のコントロールを作成できません。

交換するのに十分簡単です Controls.Clear() 次のようなもので電話してください:

Controls.Cast<Control>().ForEach(c => c.Dispose());

@hans passantの回答は良いですが、非同期プログラミングの場合は、廃棄されたオブジェクトを繰り返すためのスレッドを避けるために、それを処分する前にオブジェクトを削除することを検討する必要があります。

多かれ少なかれこのようなもの:

public static class ExtensionMethods {
  public static void Clear(this Control.ControlCollection controls, bool dispose) {
    for (int ix = controls.Count - 1; ix >= 0; --ix) {
      var tmpObj = controls[ix];
      controls.RemoveAt(ix);
      if (dispose) tmpObj.Dispose();
    }
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top