【问题标题】:C# WinForms: Drawing with one or more additional threads. How?C# WinForms:使用一个或多个附加线程进行绘图。如何?
【发布时间】:2011-09-27 14:11:52
【问题描述】:

如果我有一张包含各种几何形式(线条、矩形、圆形等)的大型绘图,则线程需要花费大量时间来绘制所有内容。但在现实生活中,一栋建筑是由不止一名工人建造的。因此,如果图纸是建筑物,线程是建造者,它会被绘制得更快。但我想知道怎么做。

你能告诉我怎么做吗?是否有可能(尽管我已经问过并且答案是“是”)?值得使用吗?有什么风险?

如果有我遗漏的问题,请告诉我并回答。

谢谢!

【问题讨论】:

    标签: c# winforms multithreading system.drawing


    【解决方案1】:

    假设您使用 GDI+ 和 System.Drawing.Graphics 对象将您的图形(矩形、圆形等)渲染到背景绘图表面(例如 System.Drawing.Bitmap 对象):System.Drawing.Graphics 对象的实例成员,您将需要使用的是不是线程安全的See MSDN documentation here

    鉴于此,我不会使用多个“构建器”线程来渲染您的图形。

    相反,我的建议是尽可能在单个后台线程而不是多个后台线程中对System.Drawing.Bitmap 对象进行所有绘图。您可以使用状态栏或其他指示器让用户知道您的程序正在后台运行。

    【讨论】:

    • 是的 - 我确实在辅助线程中完成了对位图的绘制,将位图发布到 UI 线程并在那里渲染(不是在 C# 中)。工作正常。没有用多个位图/图形对象尝试过,任何使用专业的专用硬件(例如图形芯片子系统)执行其功能的东西都是不安全的,这似乎是合理的。
    【解决方案2】:

    WinForms 对象具有很强的线程关联性,因此无法从不同于创建它的线程中操作表单或控件。

    也就是说,如果这个断言对于Graphics 也是正确的,值得调查。

    来自System.Drawing.Graphics 类文档:

    此类型的任何公共静态(在 Visual Basic 中为共享)成员都是 线程安全。不保证任何实例成员都是线程 安全。

    不好闻:所有绘图方法都是实例成员。您不能将对 Graphics 对象的操作分散到多个线程中。

    【讨论】:

      【解决方案3】:

      作为一个简单的示例,您可以使用 ThreadStart 委托方法使用线程来执行多个任务,它看起来类似于以下内容:

              Thread t = new Thread(new ThreadStart(MethodToExecuteOnSecondThread));
              t.Start();
              while (!t.IsAlive)
              {
                  //do something to show we're working perhaps?
                  UpdateMyGuiWithALoadingBar(); 
              }
      

      您是第二个线程然后关闭并执行 ThreadStart() 委托方法,而您的主线程保持响应。

      【讨论】:

      • 这个答案没有解决 Winforms 和 System.Drawing 中的线程安全/亲和性问题
      • 我很确定问题是问他是否可以使用多个“构建器”/“线程”的选项我的回答旨在演示多个“构建器”的基本用法'正如他所说的
      • 无意冒犯,但看起来问题是“是否有可能在 1 个月内生孩子”,而您回答“雇用 9 名女性”。 (嗯,有点。显然我夸大了这个问题和你的回答来说明我的想法)。
      • 无意冒犯,答案是专门针对回答这部分问题“所以如果图纸是建筑物,线程是建造者,它会绘制得更快。但我想要知道怎么做。”我认为这意味着,我想知道如何创建多个构建器。
      猜你喜欢
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 2011-11-25
      • 2021-04-20
      相关资源
      最近更新 更多