如果我有一个包含各种几何形状(线条,矩形,圆形,e.t.c。)的大绘图,则线程需要花费大量时间来绘制所有内容。但在现实生活中,一栋建筑由一个以上的工人建造。因此,如果绘图是建筑物而线程是构建器,那么绘制速度会快得多。但我想知道如何。
你能告诉我怎么样?它是否可能(虽然我已经问过,答案是“是”)?是否值得使用?有什么风险?如果有任何我错过的问题,请告诉我他们并回答他们。
谢谢!
答案 0 :(得分:5)
假设您正在使用GDI +和System.Drawing.Graphics
对象将图形(矩形,圆形等)渲染到背景绘图表面(例如System.Drawing.Bitmap
对象):{{1}的实例成员您需要使用的对象是非线程安全。 See MSDN documentation here
鉴于此,我不会使用多个“构建器”线程来渲染您的图形。
相反,我的建议是将所有绘图都放在单个后台线程中的System.Drawing.Graphics
对象中,而不是多个后台线程(如果可能)。您可以使用状态栏或其他指示器让用户知道您的程序在后台运行。
答案 1 :(得分:1)
WinForms对象具有强大的线程关联性,因此无法从与创建它的线程不同的线程操作表单或控件。
那就是说,如果Graphics
这个断言是正确的话,也值得研究。
来自System.Drawing.Graphics课程文档:
此类型的任何公共静态(在Visual Basic中为Shared)成员都是 线程安全。任何实例成员都不能保证是线程 安全
气味不好:所有绘图方法都是实例成员。您无法在多个线程的Graphics
对象上传播操作。
答案 2 :(得分:0)
作为一个简单的例子,您可以使用线程来使用ThreadStart委托方法执行多个任务,它将看起来像这样:
Thread t = new Thread(new ThreadStart(MethodToExecuteOnSecondThread));
t.Start();
while (!t.IsAlive)
{
//do something to show we're working perhaps?
UpdateMyGuiWithALoadingBar();
}
当你的主线程保持响应时,你是第二个线程,然后执行ThreadStart()委托方法。