因为内存异常,函数评估被禁用。

3
我从这行代码中得到了一个异常信息:“因为内存溢出异常,函数评估被禁用”。
this.pbErrorSign.BackgroundImageLayout =   System.Windows.Forms.ImageLayout.Stretch;

我实际上添加了一个背景图片和许多其他图片,例如警告图片和图像框而不是按钮,以使GUI更加吸引人。程序在一段时间内运行良好,现在它给我这个....请帮忙。

以下代码是来自设计师。

 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;
    }


}

欢迎来到 Stack Overflow!请编辑您的问题,包括您编写的代码。通常情况下,没有看到您的代码是无法回答问题的。 - SuperBiasedMan
这是一个带有设计师代码的完整表单...我应该在这里上传那么多代码吗? - Code_Lover
你应该上传更多相关的内容,但尽力删除与问题无关的部分。请参考此页面了解如何操作。 - SuperBiasedMan
1个回答

2

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

这是一个调试器通知,它只是告诉您它不会显示任何内容,因为程序崩溃了。当发生这种情况时,调试器也很有可能崩溃。真正的问题是导致调试器停止程序的OOM异常。

this.pbOkButton.BackgroundImage = Properties.Resources.purpleOkButton;

这就是导致崩溃的语句。您在非常频繁地移动鼠标时执行此操作。并不那么明显的是,这个语句创建了一个新的位图对象。旧的对象没有被释放。这使得您的程序的内存使用快速攀升,并且垃圾回收器几乎无法做出任何反应,因为您没有分配任何其他对象。OOM异常是相当不可避免的。

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

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事件吗? - Code_Lover
不错。你今天学到了新的东西,如何将这些知识应用到你的程序中完全取决于你自己。你还有很多东西要学习,下一步应该是创建自己的按钮类,这样就不必反复重复这段代码了。 - Hans Passant
好的...谢谢你的帮助伙计...真的非常感激! :-) - Code_Lover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接