【问题标题】:Custom control and dispose自定义控制和处置
【发布时间】:2013-11-19 14:09:50
【问题描述】:

故事的开始是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 计时器和表单处置?

【问题讨论】:

    标签: c# winforms controls dispose


    【解决方案1】:

    您必须覆盖Dispose(bool disposing)。并且不需要显式实现IDisposable

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

    【讨论】:

    • 像奇迹一样工作。快速而清晰的答案。谢谢!
    • 提示:如果您正在使用像 UserControls 这样的东西,那么 *.designer.cs 文件中已经存在“protected override void Dispose(bool disposing)”方法。随意将其移至 *.cs 文件,它不在设计器文件的“组件设计器生成的代码”区域中。
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多