C#在图像上画图,为了不卡UI控件,在actived中用task.run显示图像,然后在paint事件中画图,然后出现”当前对象正在其他地方使用“,怎么解决呢?

wap1125 2024-03-20 21:10:13
private void Form1_Activated(object sender, EventArgs e)
        {     
                       Task.Run(() =>
            {
                Video();

            });
                     
        }
private void pic_dingpeng_Paint(object sender, PaintEventArgs e)
        {

         
            Graphics ga = e.Graphics;
      
                
                ga.DrawLine(pen, 220, q_s, 800, q_s);
                ga.DrawLine(pen, 220, q_x, 800, q_x);

                ga.DrawRectangle(pen, rect_kuang);                                 
}

矩形是通过移动鼠标生成的,过一段就报警。

或者说怎么整,才能视频让不卡UI
 

...全文
235 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

在UI线程上绘制图像:可以将绘图的逻辑放在UI线程上执行,而不是使用Task.Run在后台线程中执行。这样就能确保在同一个线程上操作Graphics对象,避免跨线程访问。
private void Form1_Activated(object sender, EventArgs e)
{
    Video();
}

private void pic_dingpeng_Paint(object sender, PaintEventArgs e)
{
    Graphics ga = e.Graphics;
    ga.DrawLine(pen, 220, q_s, 800, q_s);
    ga.DrawLine(pen, 220, q_x, 800, q_x);
    ga.DrawRectangle(pen, rect_kuang);
}
2.使用Invoke来更新UI控件:如果需要在后台线程中执行绘图操作,可以通过Control.Invoke方法在UI线程上执行相应的绘图代码,确保操作UI控件的线程安全性
private void Form1_Activated(object sender, EventArgs e)
{
    Task.Run(() =>
    {
        Video();
    });
}

private void UpdateUI()
{
    if (this.InvokeRequired)
    {
        this.Invoke((MethodInvoker)delegate
        {
            // 在UI线程上执行绘图操作
            pic_dingpeng.Invalidate();
        });
    }
    else
    {
        pic_dingpeng.Invalidate();
    }
}

private void pic_dingpeng_Paint(object sender, PaintEventArgs e)
{
    Graphics ga = e.Graphics;
    ga.DrawLine(pen, 220, q_s, 800, q_s);
    ga.DrawLine(pen, 220, q_x, 800, q_x);
    ga.DrawRectangle(pen, rect_kuang);
}

wap1125 03-24
  • 举报
回复
@viruses旧人 UpdateUI()这个咋触发呢
辰龙ZZJ 03-21
  • 打赏
  • 举报
回复 1

在C#中,在UI控件上绘制图像时,确保在UI线程上进行绘制是很重要的。如果在非UI线程上进行绘制,可能会导致出现"当前对象正在其他地方使用"的错误。

为了解决这个问题,你可以使用Invoke或BeginInvoke方法将绘制操作委托给UI线程。这样可以确保在UI线程上执行绘制操作,避免多线程冲突。

下面是一个示例代码,展示了如何在UI控件上绘制图像:

csharp
private void Form1_Activated(object sender, EventArgs e)
{
Task.Run(() =>
{
// 在后台线程加载图像
Image image = LoadImage();

    // 在UI线程上绘制图像
    this.Invoke((MethodInvoker)delegate
    {
        // 在paint事件中使用绘制图像
        pictureBox1.Image = image;
        pictureBox1.Invalidate(); // 强制重绘
    });
});

}

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// 在paint事件中进行绘制操作
Graphics g = e.Graphics;
// 绘制图像的代码...
}

private Image LoadImage()
{
// 加载图像的代码...
}

110,541

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧