由于内存不足异常,函数求值被禁用

本文关键字:函数 内存不足 异常 | 更新日期: 2023-09-27 18:01:42

我从这行代码中得到这个异常"函数评估由于内存不足异常而被禁用"。

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

}

由于内存不足异常,函数求值被禁用

由于内存不足异常而禁用函数求值

这是一个调试器通知,它只是告诉您它不会显示任何内容,因为程序因OOM而崩溃。当发生这种情况时,调试器崩溃的可能性也很高。真正的问题是您得到的导致调试器停止程序的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);
}