我面临一些问题,在Panel中绘制一个矩形(System.Drawing)
。问题是我必须使用Task执行此操作以保持UI响应。
我怀疑这是一个thread-safety
问题,但我不确定。当我遇到线程安全问题时,我正在使用 Invoke
对其进行故障排除。但它似乎不适用于 System.Drawing
方法。
这是我的代码(在Panel Paint事件中触发):
private void setup(object sender, PaintEventArgs e) {
int x = 50;
int y = 50;
int w = 15;
int h = w;
Color color = Color.FromArgb(255, 255, 255);
Point location = new Point(x, y);
Size size = new Size(w, h);
Task t = Task.Run(()=> {
Rectangle Rect = new Rectangle(location, size);
e.Graphics.DrawRectangle(new Pen(color), Rect);
e.Graphics.FillRectangle(new SolidBrush(color), Rect);
});
}
P.S:我打算让一个班级做所有的绘画工作,我不知道它是否可以在以后改变。
错误:
e.Graphics.DrawRectangle(new Pen(color),Rect);线正在回归 一个 OutOfMemory 的重复。
修改:
关于主题Draw on a form by a separate thread,当我使用此缓冲区时,我停止了错误,但它没有在Panel中绘制我的矩形。代码如下:
Bitmap buffer = new Bitmap(this.Width, this.Height);
Task t = Task.Run(()=> {
Rectangle Rect = new Rectangle(location, size);
using (Graphics g = Graphics.FromImage(buffer)) {
g.DrawRectangle(new Pen(color), Rect);
g.FillRectangle(new SolidBrush(color), Rect);
}
Invoke(new Action(() =>
{
BackgroundImage = buffer;
}));
});
编辑2:
关于上面的代码,它似乎不正确,因为它没有使用Panel的PaintEventArgs
。这可能是我在Panel上看不到矩形的原因。
编辑3:
如果我不使用Panel,上面的代码可以正常工作。它可以直接在Form中绘制(当我使用FormLoad事件时)。我只需要知道如何在Panel中做到这一点。