Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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/4/macos/8.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#_Forms_Label_Dispose - Fatal编程技术网

C# 无法销毁我的按钮标签

C# 无法销毁我的按钮标签,c#,forms,label,dispose,C#,Forms,Label,Dispose,我正在为一家公司开发“缓存图像生成器”。 此表单的目标是预先计算场景中所有可能的按钮。 它创建了两个自定义按钮,拍摄快照,清除所有内容,然后重做,直到全部尝试 我的问题是无法销毁自定义按钮内的标签。 我的自定义按钮工作正常,我可以生成第一个图像。 因为我使用索引作为标签名称的最后一部分,所以我相信第二轮将由于存在同名的项目而失败 这就是我试图摧毁一切的方式: foreach (my_button b in this.wrapper.Controls.OfType<my_button>

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

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

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

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();
我相信这不是一个毁灭性的麻烦,因为我随机得到了这个:
非法的跨线程操作:从创建控件的线程以外的线程访问控件“Control name”。
关于labels Dispose()调用

提前感谢您的帮助

--编辑--

我解决了。
问题是对我的机器框架的错误调用,该调用将所有可见内容设置为false

请删除此问题,因为它不会有用

由于跨线程调用异常,这是因为您错误地实现了
Dispose(bool)
Dispose(bool)
可以从finalizer方法调用,并且该方法的调用线程未指定,例如,它可以来自任何线程

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

Control.Dispose方法(布尔值)

释放控件及其子控件使用的非托管资源 控制并(可选)释放托管资源

无论如何,如果位图的所有者是
my_button
,并且没有其他对象将使用相同的位图,则可能需要处理自己的位图。您可以按如下方式进行操作:

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

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

GC.Collect
从来都不是一个好主意。我想您应该使用
cc.Controls.Remove(c)
(现在不确定语法是否正确)按钮b=new Button();ContentControl c=b作为ContentControl;c、 内容=空;谢谢你的回答,它解决了异常错误。但我无法在第二轮中更改按钮的“可见”属性。在第一轮中,我的_按钮是用Visible=true创建的,在第二轮中,它们是用Visible=false创建的,即使我调用b.Visible=true,我仍会在即时窗口中看到Visible=false。我更新了我的问题,我认为主要的问题是我无法创建其他标签,因为旧标签(同名)已经存在于某处。再次感谢您的帮助:)
protected override void Dispose(bool disposing)
{
    if (disposing) {
         var backgroundImage = this.BackgroundImage;
         this.BackgroundImage = null;
         backgroundImage.Dispose();
    }
    base.Dispose(disposing);
}