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使用引起的其他异常,但它也只在你向上移动时出现
答案 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
事件被提出来了。
然后,你创建一个新线程,让它永远运行,继续移动表单,创建一个新线程,等等......
所以你应该做的是创建一个方法(建议:称之为ROFL
,YOLO
或SWAG
),在产生一个新线程之前销毁该线程。