C#将面板保存为多线程图像

穆拉特

我将面板保存为带有UI线程的图像没有任何问题,但是当我将面板保存到UI线程以外的其他线程时,我只有黑色矩形:

using (Bitmap bmp = new Bitmap(panel1.Width, panel1.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
        {
            if (panel1.InvokeRequired)
            {
                panel1.BeginInvoke((MethodInvoker)delegate ()
                {
                    panel1.DrawToBitmap(bmp, new System.Drawing.Rectangle(Point.Empty, bmp.Size));

                });
                Bitmap bb = bmp.Clone(new System.Drawing.Rectangle(0, 0, 1016, 648), PixelFormat.Format24bppRgb);
                bb.Save(@"C:\sample.bmp", ImageFormat.Bmp);
            }
            else
            {
              panel1.DrawToBitmap(bmp, new System.Drawing.Rectangle(Point.Empty, bmp.Size));
              Bitmap bb = bmp.Clone(new System.Drawing.Rectangle(0, 0, 1016, 648), PixelFormat.Format24bppRgb);
              bb.Save(@"C:\sample.bmp", ImageFormat.Bmp);
            }

        }

这个问题跟锁机制有关吗?或者我该如何解决这个问题?

提前致谢。

朱罗

普遍答案(有解释)

BeginInvoke 是发送消息“此功能应在其他线程中执行”的函数,然后直接离开以继续在当前线程中执行。

当目标线程具有“空闲时间” (处理之前发布的消息)时,将在以后的时间执行该函数

需要功能的结果时,请使用InvokeInvoke函数“较慢”,或者说它阻塞当前线程,直到执行的函数完成为止。(我较新的人实际上在C#中对此进行了测试,但是可能对Invoke函数进行了优先级排序;例如,当您调用BeginInvoke它并直接在Invoke同一线程之后对其进行调用时,from函数Invoke可能会在from函数之前执行BeginInvoke。)

当您需要在处理下一条指令之前执行该函数时(当您需要被调用函数的结果时),请使用此替代方法

简单(tl; dr):当您只需要设置一个值(例如,设置编辑框的文本)时,请使用BeginInvoke,但是当您需要一个结果(例如,从编辑框获取文本)时,请始终使用Invoke

在您的情况下,您需要结果(要绘制位图),因此您需要等待函数结束。(还有其他可能的选择,但是在这种情况下,简单的方法是更好的方法。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章