特殊的OutOfMemory异常

时间:2017-03-11 16:46:54

标签: c# multithreading winforms

经过大的努力,我写了“游戏引擎”,我发现了非常奇怪的错误。 当您移动表单时,会出现OutOfMemory异常(应用程序在不到5秒的时间内从需要24 MB跳到超过6 GB的ram)但这并不是最糟糕的事情。只有当你向上移动时才会出现这种情况,在任何其他方向都不会发生任何事情。这里是我编写的一段代码与我的应用程序类似,虽然这在移动形式后立即崩溃

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication10
{
public partial class Form1 : Form
{
    Graphics h;
    Bitmap bmp;
    System.Threading.Thread WTF;
    public Form1()
    {
        InitializeComponent();
    }


    private void LOL()
    {

        bmp = new Bitmap(500, 500);
        Graphics WHAAAAT = Graphics.FromImage(bmp);
        while (true)
        {

            WHAAAAT.FillEllipse(Brushes.Black, 50, 50, 50, 50);
            h.DrawImage(bmp, 0, 0);

        }
    }
    private void WOOT(Graphics g)
    {
        h = g;
        WTF = new System.Threading.Thread(new System.Threading.ThreadStart(LOL));
        WTF.Start();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        Graphics d = panel1.CreateGraphics();
        d.FillEllipse(Brushes.Black, 50, 50, 50, 50);
        WOOT(d);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        WTF.Abort();
    }
}

}

表单边框样式设置为singleFixed。知道为什么会发生这种事吗? 在我的情况下,它抛出了由大量RAM使用引起的其他异常,但它也只在你向上移动时出现

1 个答案:

答案 0 :(得分:5)

这不是错误,它是您创建过多线程的结果:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Graphics d = panel1.CreateGraphics();
    d.FillEllipse(Brushes.Black, 50, 50, 50, 50);
    WOOT(d);
}

每次重绘面板时(通常在窗口移动时失效)都会创建一个新线程(顺便提一下,调用WOOT,创意名称)。但是,此主题永远运行(请参阅LOL,也是广告素材名称)

因此,只要您开始移动表单并且该面板的某些部分无效(例如,当它们被其他内容或屏幕外覆盖时),一旦它们再次显示,Paint事件被提出来了。

然后,你创建一个新线程,让它永远运行,继续移动表单,创建一个新线程,等等......

所以你应该做的是创建一个方法(建议:称之为ROFLYOLOSWAG),在产生一个新线程之前销毁该线程。