C# 由于内存不足异常,已禁用函数评估

C# 由于内存不足异常,已禁用函数评估,c#,winforms,exception-handling,C#,Winforms,Exception Handling,我从这行代码中得到一个异常“由于内存不足异常而禁用了函数求值” this.pbErrorSign.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 我实际上已经添加了一个背景图像和许多其他图像,比如警告图像和图片框,而不是按钮,以制作有吸引力的GUI。前一段时间程序运行良好,现在它给了我这个。。。。帮助plz 以下代码来自designer this.pbErrorSign.BackColor = Syste

我从这行代码中得到一个异常“由于内存不足异常而禁用了函数求值”

this.pbErrorSign.BackgroundImageLayout =   System.Windows.Forms.ImageLayout.Stretch;
我实际上已经添加了一个背景图像和许多其他图像,比如警告图像和图片框,而不是按钮,以制作有吸引力的GUI。前一段时间程序运行良好,现在它给了我这个。。。。帮助plz

以下代码来自designer

 this.pbErrorSign.BackColor = System.Drawing.Color.Transparent;
        this.pbErrorSign.BackgroundImage = global::SAMS.Properties.Resources.ErrorSign3;
        this.pbErrorSign.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
        this.pbErrorSign.Location = new System.Drawing.Point(69, 121);
        this.pbErrorSign.Name = "pbErrorSign";
        this.pbErrorSign.Size = new System.Drawing.Size(30, 30);
        this.pbErrorSign.TabIndex = 1;
        this.pbErrorSign.TabStop = false;
以下是名为errorDialogForm的表单代码

public partial class ErrorDialogForm : Form
{
    protected override void OnShown(EventArgs e)
    {
        base.OnShown(e);
        this.Capture = true;
    }



    public ErrorDialogForm()
    {
        InitializeComponent();
    }

    public string LabelText
    {
        get
        {
            return this.lblError.Text;
        }
        set
        {
            this.lblError.Text = value;
        }
    }



    private void pbOkButton_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void pbOkButton_MouseEnter(object sender, EventArgs e)
    {
        this.pbOkButton.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.purpleOkButton));
    }

    private void pbOkButton_MouseLeave(object sender, EventArgs e)
    {
        this.pbOkButton.BackgroundImage = ((System.Drawing.Image)(Properties.Resources.blueOkButton));
    }



    private void ErrorDialogForm_Enter(object sender, EventArgs e)
    {
        this.Close();
    }

    private void ErrorDialogForm_Deactivate(object sender, EventArgs e)
    {
        this.Close();
    }

    private void ErrorDialogForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        this.Hide();
        this.Parent = null;
        e.Cancel = true;
    }


}
由于内存不足异常,已禁用函数评估

这是一个调试器通知,它只是告诉您它不会向您显示任何内容,因为程序在OOM中崩溃。发生这种情况时,调试器崩溃的可能性非常高。真正的问题是您得到的OOM异常导致调试器停止程序

this.pbOkButton.BackgroundImage=Properties.Resources.purpleOkButton

这就是导致坠机的原因。您可以在移动鼠标时频繁触发的事件中执行此操作。不太明显的是,该语句创建了一个新的位图对象。旧的没有被处理掉。这使得程序的内存使用率迅速攀升,而垃圾回收器对此可以做任何事情的几率很低,因为您不分配任何其他对象。这是不可避免的

正确的修复方法是只创建这些位图一次:

private Image purpleOk;
private Image blueOk;

public ErrorDialogForm()
{
    InitializeComponent();
    purpleOk = Properties.Resources.purpleOkButton;
    blueOk = Properties.Resources.blueOkButton;
    pbOkButton.BackgroundImage = blueOk;
}

private void pbOkButton_MouseEnter(object sender, EventArgs e)
{
    this.pbOkButton.BackgroundImage = purpleOk;
}

private void pbOkButton_MouseLeave(object sender, EventArgs e)
{
    this.pbOkButton.BackgroundImage = blueOk;
}

protected override void OnFormClosed(FormClosedEventArgs e) 
{
    purpleOk.Dispose();
    blueOk.Dispose();
    base.OnFormClosed(e);
}

欢迎来到堆栈溢出!请编辑您的问题以包含您编写的代码,通常不可能在没有看到您的代码的情况下回答问题。这是一个包含设计器代码的完整表单。。。我应该在这里上传那么多代码吗?你应该上传比这里更多的代码,但是尽你所能删掉与问题无关的代码。请参阅以获取有关如何执行此操作的帮助。非常感谢Hans Passant。但我在项目中以各种形式做到了这一点。所以我几乎从一开始就要做。。。我能做些什么来处理当前制作的事件吗?比如表单关闭时的pbCancel_MouseEnter?不。你今天学到了一些新东西,如何将这些知识应用到你的程序中完全取决于你。你还有很多东西要学,创建你自己的Button类,这样代码就不必重复,下一步应该是。谢谢你的帮助,伙计。。。真的很感激!:-)