0

我正在为一家公司开发“缓存图像生成器”。
此表单的目标是预先计算所有可能的按钮场景。
它创建了几个自定义按钮,拍摄快照,清除所有内容并重做,直到全部尝试。

我的问题是我无法破坏自定义按钮内的标签。
我的自定义按钮工作正常,我可以生成第一张图片。
因为我使用索引作为标签名称的最后一部分,所以第二轮将由于现有的同名项目而失败,我相信。

这就是我试图摧毁一切的方式:

foreach (my_button b in this.wrapper.Controls.OfType<my_button>())
{
    b.resume_layout();
    b.show();
}
this.PerformLayout();
bmp = new Bitmap(this.wrapper.Width, this.wrapper.Height);
this.wrapper.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
a.result = bmp;
cc = this.wrapper.Controls;
this.wrapper.Controls.Clear();
foreach (Control C in cc)
    C.Dispose();
cc = null;
GC.Collect();

这是 my_button 的自定义 Dispose 处理程序:

    new public void Dispose()
    {
        this.Dispose(true);
    }

    protected override void Dispose(bool disposing)
    {
        this.currency_label.Dispose();
        this.name_label.Dispose();
        this.price_label.Dispose();
        this.currency_label = this.name_label = this.price_label = null;
        this.BackgroundImage = null;
        this.Controls.Clear();
        base.Dispose(disposing);
    }

我相信这是一个不会破坏的麻烦,因为我随机得到这个:
Illegal cross-thread operation: Control 'control name' accessed from a thread other than the thread it was created on.在标签上 Dispose() 调用。

提前感谢您的帮助。

- 编辑 -

我解决了。
问题是对我的 mooremachine 框架的错误调用,它设置了所有内容 Visible=false
请删除这个问题,因为它没有用。

4

1 回答 1

0

由于跨线程调用异常的原因,是因为你错误地实现了Dispose(bool). Dispose(bool)可以从终结器方法调用,并且未指定调用线程,例如它可以来自任何线程。

关于您添加的控件,您不需要添加额外的 dispose 方法。子控件会自动释放。

http://msdn.microsoft.com/en-us/library/a4zkb31d.aspx

Control.Dispose 方法(布尔值)

释放 Control 及其子控件使用的非托管资源,并可选择释放托管资源。

my_button无论如何,如果位图的所有者是并且没有其他对象将使用相同的位图,您可能想要处置自己的位图。你可以这样做:

protected override void Dispose(bool disposing)
{
    if (disposing) {
         var backgroundImage = this.BackgroundImage;
         this.BackgroundImage = null;
         backgroundImage.Dispose();
    }
    base.Dispose(disposing);
}

并且不需要重新声明Dispose()方法。

于 2013-06-22T11:24:09.153 回答