自定义控制和处置
Posted
技术标签:
【中文标题】自定义控制和处置【英文标题】: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 计时器和表单处置?
【问题讨论】:
【参考方案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
。
【讨论】:
以上是关于自定义控制和处置的主要内容,如果未能解决你的问题,请参考以下文章