我有一个项目,在一段时间后可以有数千个控件,并且每个控件都被清理干净,但是这个过程开始占用大量的处理器时间并且在调用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();
}
}
}
答案 0 :(得分:-1)
将控件复制到单独的集合中,从表单中清除控件,然后关闭后台工作程序以处理处理。
List<Control> OldControls = new List<Control>(MyForm.Controls);
MyForm.Controls.Clear();
// Create background worker to dispose of the controls in OldControls