有没有办法做一个非阻塞的Dispose()
本文关键字:Dispose 一个 有没有 | 更新日期: 2023-09-27 17:56:53
我有一个项目,一段时间后可以有数千个控件,并且每个控件都净地释放,但是这个过程开始占用大量的处理器时间,并且在对父对象调用Dispose时它会锁定UI。
无论如何,可以在不阻塞过程中的UI的情况下对容器内的所有对象和子对象进行级联处置?
若要重现此问题,可以创建一个带有子控件的新控件,并且每个子控件都向其添加另一个控件。在此之后,确保在每个控件和子控件中都有正确的 Dispose() 代码,然后在父 Dispose() 方法中使用此循环:
while(Controls.Count > 0) { Controls[0].Dispose(); }
然后删除这个包含多个子控件的新控件(我使用自定义 Add 方法将所有子控件添加到父控件)。
在新控件容器中显示大约一百个此类控件后,调用它的 dispose 方法---自定义控件的绝对父级。 一个简单的结构如下(不包括它们的子 Dispose 方法)
public class MyCoolClass : ScrollableContainer, IDisposable {
public List<MyBox> Boxes { get; set; }
public MyCoolClass() {
Boxes = new List<MyBox>();
}
public Add() {
MyBox box = new MyBox();
int next_top = 0;
if(Boxes.Count > 0) {
next_top = Boxes[Boxes.Count-1].Top + Boxes[Boxes.Count-1].Height + 10;
} else {
next_top = 10;
}
box.Top = next_top;
Boxes.Add(box);
Controls.Add(box);
}
public ReloadBoxes() {
Controls.Clear();
SuspendUpdate();
int next_top = 0;
foreach(MyBox box in Boxes) {
if(next_top==0) { next_top = 10; }
box.Top = next_top;
next_top = box.Top + box.Height + 10;
}
ResumeUpdate();
}
internal class MyBox : Control, IDisposable {
internal class WriteArea : RichTextBox, IDisposable {
}
WriteArea TT;
public MyBox() {
TT = new WriteArea();
}
}
}
将控件复制到单独的集合,从窗体中清除控件,然后剥离后台辅助角色来处理释放。
List<Control> OldControls = new List<Control>(MyForm.Controls);
MyForm.Controls.Clear();
// Create background worker to dispose of the controls in OldControls
后台工作者