绘制任务/线程

时间:2018-05-25 05:25:04

标签: c# thread-safety

我面临一些问题,在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中做到这一点。

0 个答案:

没有答案