C# · 12月 25, 2021

c# – .NET中的多线程绘图?

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

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

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

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

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

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

解决方法 Task Parallel Library绝对是寻找简化代码的地方.我亲自为 Parallelism with .NET 4写了一篇(半长)的介绍,其中介绍了很多有用的概念.

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

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

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

这为您提供了一个可合理扩展但相当简单的设计,您可以在其上构建.