我将面板保存为带有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
是发送消息“此功能应在其他线程中执行”的函数,然后直接离开以继续在当前线程中执行。
当目标线程具有“空闲时间” (处理之前发布的消息)时,将在以后的时间执行该函数。
需要功能的结果时,请使用Invoke
。该Invoke
函数“较慢”,或者说它阻塞当前线程,直到执行的函数完成为止。(我较新的人实际上在C#中对此进行了测试,但是可能对Invoke
函数进行了优先级排序;例如,当您调用BeginInvoke
它并直接在Invoke
同一线程之后对其进行调用时,from函数Invoke
可能会在from函数之前执行BeginInvoke
。)
当您需要在处理下一条指令之前执行该函数时(当您需要被调用函数的结果时),请使用此替代方法。
简单(tl; dr):当您只需要设置一个值(例如,设置编辑框的文本)时,请使用BeginInvoke
,但是当您需要一个结果(例如,从编辑框获取文本)时,请始终使用Invoke
。
在您的情况下,您需要结果(要绘制位图),因此您需要等待函数结束。(还有其他可能的选择,但是在这种情况下,简单的方法是更好的方法。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句