.NET中的多线程绘图?

Cam*_*tin 6 c# vb.net parallel-processing concurrency multithreading

(编辑:澄清一下,我的主要目标是并发,但不一定是多核机器)

我对所有关于并发的概念都相当新,但我发现我需要有并行绘图例程,原因有很多:

  • 我想分开绘制图形的不同部分(背景刷新的频率低于前景,保留在缓冲区中).
  • 我希望控制优先级(UI响应性比绘制复杂图表更优先).
  • 我希望每帧绘图计算多线程.
  • 我想为复杂的缓冲区绘图程序提供取消.

然而,作为一个初学者,我的代码很快看起来像一团糟,重构或错误修复变得如此尴尬,我决定在做任何严肃的事情之前我需要更多地使用它.

所以,我想知道如何制作干净,易于保存的.NET多线程代码,这些代码在我第二天醒来后看到它时才有意义.我遇到的最大问题是构建应用程序,因此所有部分都以智能(而不是笨拙和hacky)方式相互交谈.

任何建议都是受欢迎的,但我喜欢我可以在空闲时间消化的来源(例如,不是500多页的并发论文)和C#/ VB.NET,直到最新版本(因为我看到那里)一直在进步).基本上我想要一些直截了当的东西,所以我可以开始玩我的玩具项目的概念.

小智 9

但我发现我需要有并行绘图程序

三个字:不在WINDOWS之下.

很简单.出于兼容性原因,标准窗口绘制是每个定义的单线程.任何UI控件(让我们坚持.NET世界)都只能从它的创建线程中进行操作(所以实际上它比单线程更残酷 - 它只是一个特定的线程).

你可以单独进行预先计算,但是真正的绘图已经从那个线程中完成了.

除非你分配一个位图,在那里有你自己的绘图,然后把它转到UI线程上绘制到窗口上.

这与整个任务并行库等(我将其投票)无关,但是由于简单原因和兼容性而保留了一个非常古老的要求.这就是任何UI线程作为sintgle threads appartement进入市场的原因.

另请注意,如果您自己实施多线程绘图,则会产生严重影响.哪一个以光学方式获胜(留在前台)?使用多线程时,这无法确定.不过你可以自由尝试.

在这种情况下:

  • 拥有自己的缓冲区和同步是必须的.远离任何Windows级别的图形库(WPF或Winforms),除了最后一步(生成位图).

  • 据称DirectX 11对多线程调用有一些支持,但我不确定它会走多远.


Ree*_*sey 2

任务并行库绝对是寻找简化代码的地方。我亲自写了一篇关于 .NET 4 并行性的(半长)介绍,其中涵盖了相当多有用的概念。

但请注意,您可能会考虑将绘图保留为单线程。您应该尝试保持计算多线程,并在 GUI 线程上完成实际的绘图操作。

大多数绘图 API 要求所有实际绘图调用发生在同一同步上下文中。

话虽这么说,使用像ConcurrentQueue这样的新集合类可以简化此类代码。尝试考虑许多线程(生产者)将“绘图操作”添加到共享的并发队列 - 以及一个线程(消费者)获取操作并执行它们。

这为您提供了一个相当可扩展但相当简单的设计,您可以在此基础上进行构建。