C#WinForms:使用一个或多个其他线程绘图。怎么样?

时间:2011-09-27 14:11:53

标签: c# winforms multithreading system.drawing

如果我有一个包含各种几何形状(线条,矩形,圆形,e.t.c。)的大绘图,则线程需要花费大量时间来绘制所有内容。但在现实生活中,一栋建筑由一个以上的工人建造。因此,如果绘图是建筑物而线程是构建器,那么绘制速度会快得多。但我想知道如何。

你能告诉我怎么样?它是否可能(虽然我已经问过,答案是“是”)?是否值得使用?有什么风险?

如果有任何我错过的问题,请告诉我他们并回答他们。

谢谢!

3 个答案:

答案 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()委托方法。