【问题标题】:peculiar OutOfMemory exception特殊的 OutOfMemory 异常
【发布时间】:2017-08-01 22:46:15
【问题描述】:

经过一番努力,我写了“游戏引擎”,我发现了一个非常奇怪的错误。 当您移动表单时,您会得到 OutOfMemory 异常(应用程序在不到 5 秒的时间内从需要 24 MB 的内存跳转到超过 6 GB 的内存),但这并不是最奇怪的事情。这仅在您向上移动表格时出现,在任何其他方向都不会发生任何事情。这是我编写的一段代码,其工作方式与我的应用程序相似,尽管在向上移动表单后会立即崩溃

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 使用引起的其他异常,但它也仅在您向上移动表单时出现

【问题讨论】:

  • 你分析过它吗?
  • 有一个名为 WTF 的变量是鼻恶魔的 c# 后门,这就是为什么会发生奇怪的事情:)

标签: c# multithreading winforms


【解决方案1】:

这不是bug,是你创建过多线程的结果:

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)在产生新线程之前破坏线程。

【讨论】:

  • 这就解释了一切。另外,为什么只有当你向上移动时它才会重新绘制?
  • 它总是重新绘制面板的一部分被覆盖,并且当该部分再次暴露给查看器时必须再次重新绘制。
猜你喜欢
  • 1970-01-01
  • 2015-07-28
  • 2018-06-18
  • 2015-04-25
  • 2016-04-26
  • 2014-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多