定制控制和处置

时间:2013-11-19 14:09:51

标签: c# winforms controls dispose

故事的开头是here

我有一个组件,我希望它清理计时器(托管资源,对吧?):

public class MyPictureBox : PictureBox, IDisposable
{
    private Timer _timer1 = new Timer();
    private Timer _timer2 = new Timer();
    public MyPictureBox(): base()
    {
        _timer1.Interval = 100;
        _timer1.Start();
        _timer2.Interval = 250;
        _timer2.Start();
    }

    // ... all sort of code


    new void Dispose()
    {
        base.Dispose();
        _timer1.Dispose();
        _timer2.Dispose();
    }

    void IDisposable.Dispose()
    {
        _timer1.Dispose();
        _timer2.Dispose();
    }
}

如您所见,我尝试再实现一个(oO)IdDisposable(尽管PictureBox-> Control-> Component-> IDisposable)。但是......没有一个被称为。

使用设计师对表格进行控制。但它不会以Components形式出现,这应该是在处理表单时不调用它的原因:

Form1 form = new Form1();
form.Dispose(); // MyPictureBox.Dispose() are not called

我的问题是我应该如何组织处理我的控制计时器以获得我需要的东西 - 将MyPictureBox计时器与表格处理一起处理?

2 个答案:

答案 0 :(得分:4)

您必须覆盖Dispose(bool disposing)。并且无需明确实施IDisposable

protected override void Dispose(bool disposing)
{
    _timer1.Dispose();
    _timer2.Dispose();
    base.Dispose(disposing);
}

答案 1 :(得分:2)

尽管Sriram的答案是正确的,但如果您使用的是非托管类型,例如COM对象,则应使用Finalizer模式:

public class MyPictureBox : PictureBox, IDisposable
{
    private Timer _timer1 = new Timer();
    private Timer _timer2 = new Timer()

    //more of your stuff 

    ~MyPictureBox ()
    {
        Dispose(false);
    }

    protected override void Dispose(bool disposing)
    {
         //clean up unmanaged here

        if(disposing)
        {
            _timer1.Dispose();
            _timer2.Dispose();
        }

        base.Dispose(disposing);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

请参阅处理模式:http://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx

当您使用PictureBox时,请记住必须的图像类型也是IDisposable