Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义控件和处置_C#_Winforms_Controls_Dispose - Fatal编程技术网

C# 自定义控件和处置

C# 自定义控件和处置,c#,winforms,controls,dispose,C#,Winforms,Controls,Dispose,故事的开始是 我有一个组件,我希望它能够清理计时器(托管资源,对吗?): 如您所见,我尝试实现了另外一个(oO)IdDisposable(尽管PictureBox->Control->Component->IDisposable)。但是他们没有一个被叫来 控件通过使用设计器放置在窗体上。但是它不会出现在表单组件中,这应该是在处理表单时不调用它的原因: Form1 form = new Form1(); form.Dispose(); // MyPictureBox.Dispose() are n

故事的开始是

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

如您所见,我尝试实现了另外一个(oO)
IdDisposable
(尽管PictureBox->Control->Component->IDisposable)。但是他们没有一个被叫来

控件通过使用设计器放置在窗体上。但是它不会出现在表单
组件中,这应该是在处理表单时不调用它的原因:

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

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

您必须覆盖
处理(bool disposing)
。并且无需显式实现
IDisposable

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

您必须重写
Dispose(bool disposing)
。并且无需显式实现
IDisposable

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

尽管Sriram的回答是正确的,但如果您使用的是非托管类型,如COM对象,则应使用终结器模式:

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);
    }
}
请参见处置模式:


在使用PictureBox时,请记住图像类型也必须是可识别的。

尽管Sriram的回答是正确的,但如果您使用的是非托管类型,如COM对象,则应使用终结器模式:

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);
    }
}
请参见处置模式:


在使用PictureBox时,请记住图像类型也必须是可识别的。

工作起来就像一个奇迹。快速清晰的回答。谢谢提示:如果您使用的是类似UserControls的sth,则*.designer.cs文件中已存在“protected override void Dispose(bool disposing)”方法。请随意将其移动到*.cs文件,它不在设计器文件的“Component Designer generated code”(组件设计器生成代码)区域中。工作起来就像一个奇迹。快速清晰的回答。谢谢提示:如果您使用的是类似UserControls的sth,则*.designer.cs文件中已存在“protected override void Dispose(bool disposing)”方法。请随意将其移动到*.cs文件,它不在设计器文件的“组件设计器生成的代码”区域中。