在多个线程中使用单个位图Graphics.CopyFromScreen最有效的方法?

use*_*771 5 c# multithreading bitmap

所以我有一个线程将不断抓取屏幕截图并将返回的位图Graphics.CopyFromScreen放入公共位图对象.这个想法是让多个其他线程使用这个位图,但仅用于读取目的,不写入位图.最初我只是尝试从它读取,但很快发现它锁定整个位图,以便它不能在别处使用.我的第二个选择是在每个需要使用公共位图的线程中创建一个新的临时位图tempBitMap = publicBitMap.这似乎抛出一些例外,我觉得可能还有更好的方法.我看到你可以锁定你需要在多个线程中使用的特定位/像素,然后在完成它们后释放它们,但这是否会阻止在锁定期间写入整个位图?或者它只是写入整个位图,除了那些锁定的位/像素.正在使用公共位图的方法只使用1个像素时间,这或许可以工作,提供公共位图可以写信给同时某些位/像素被锁定.

只是寻找最有效的解决方案,如果有人能就最有效的解决方案提出建议,我将非常感激,谢谢.

编辑:我使用BitMap.GetPixel()方法锁定位图.

usr*_*usr 2

我的第二个选择是在每个需要使用公共位图的线程中创建一个新的临时位图,然后简单地 tempBitMap = publicBitMap

这是正确的做法。您不能同时写入和读取位图。您可能应该同时激活两个位图。一种是为了写作,一种是为了读者。每次写入后,您交换它们。请注意,读者必须先处理完位图,然后才能开始写入。

如果您每次创建一个新的位图进行写入,则交接会变得更简单,但您现在遇到的问题是,一旦不再使用每个位图,您就需要对其进行处理。如果不这样做,您可能会很快耗尽 RAM,因为 GC 无法识别非托管内存缓冲区的存在。

这似乎引发了一些异常,我觉得无论如何可能有更好的方法。

您可能应该调试它们。没有什么根本原因说明这行不通。

我看到您可以锁定需要在多个线程中使用的特定位/像素,然后在完成后释放它们,但这是否会阻止在锁定期间写入整个位图?

我不知道。这听起来是一个非常复杂的计划。让一些区域可读,一些区域可写将需要大量的协调,并且您永远无法读取一致的完整位图。

只是寻找最有效的解决方案

这就是两位位图模型。