明確なコントロールはそれらを処分しません - リスクは何ですか?
-
21-09-2019 - |
解決
このような変更を求めることは無意味で、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();
}
}
}
所属していません StackOverflow