C# 在任务/线程中绘制

C# 在任务/线程中绘制,c#,thread-safety,C#,Thread Safety,我在面板中绘制一个矩形时遇到了一些问题。问题是,我必须使用任务来实现这一点,以保持UI的响应性。 我怀疑这是线程安全问题,但我不确定。当我遇到线程安全问题时,我正在使用Invoke对其进行故障排除。但它似乎不适用于System.Drawing方法 这是我的代码(在面板绘制事件中触发): private void setup(object sender, PaintEventArgs e) { int x = 50; int y = 50;

我在面板中绘制一个矩形时遇到了一些问题。问题是,我必须使用任务来实现这一点,以保持UI的响应性。 我怀疑这是线程安全问题,但我不确定。当我遇到线程安全问题时,我正在使用
Invoke
对其进行故障排除。但它似乎不适用于
System.Drawing
方法

这是我的代码(在面板绘制事件中触发):

    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);

        });
    }
附言:我打算开一门课来做所有的绘画工作,我不知道它以后是否能改变一切

错误

e.Graphics.DrawRectangle(新笔(颜色),Rect);电话又接通了 失忆的借口

编辑

关于这个主题,当我使用这个缓冲区时,我不再有错误,但它不会在面板上绘制我的矩形。代码如下:

        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:

    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);

        });
    }
关于上面的代码,它似乎不正确,因为它没有使用面板的
PaintEventArgs
。这可能就是我在面板上看不到矩形的原因

编辑3:

    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);

        });
    }

如果我不使用面板,上面的代码可以正常工作。它可以直接在表单中绘制(当我使用FormLoad事件时)。我只需要知道如何在面板内进行操作。

如果当前的绘图代码(没有任务)没有响应,您将绘制到已处理的图形对象。。。计算机说noI会在你的任务中使用缓冲区重新计算。类似于:
Bitmap buffer=新位图(宽度、高度);Graphics g=Graphics.FromBitmap(缓冲区)有没有具体的原因让我们在画完矩形后等待5秒钟,然后什么也不做?否则,我看不出处理程序不能同步运行的原因。如果你想与UI对象交互(和
PaintEventArgs
以及你通过它访问的任何东西都肯定在这个类中),你需要在UI线程上。我认为这里的整个计划是徒劳的。是的,您可以在其他任务或线程中构造一些图像,但在处理
Paint
事件时,您将无法这样做。寻找其他途径,例如将您的工作(如果花费的时间太长)拆分为可以在
计时器
组件的回调中完成的工作。