有没有办法做一个非阻塞的Dispose()

时间:2015-06-18 14:43:27

标签: c# .net winforms dispose idisposable

我有一个项目,在一段时间后可以有数千个控件,并且每个控件都被清理干净,但是这个过程开始占用大量的处理器时间并且在调用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();
           }
    }

}

1 个答案:

答案 0 :(得分:-1)

将控件复制到单独的集合中,从表单中清除控件,然后关闭后台工作程序以处理处理。

List<Control> OldControls = new List<Control>(MyForm.Controls);
MyForm.Controls.Clear();
// Create background worker to dispose of the controls in OldControls

Backgroundworker