我不确定是否使用 Mutex 或 Semaphore 或其他一些工具。
这是我的场景:在多线程环境中,某些事件会导致将图像写入磁盘。此图像在事件处理程序中生成。
问题是,事件 A 会导致写入图像 A.png,而事件 B 会导致写入名为 B.png 的图像。
如果这些事件同时发生,则可以保存图像(尽管磁盘显然不能很好地处理并行写入)但这是一个有效的场景。
但是有时会多次触发事件 A。这也是有效的,但为相同的文件名调用 image.Save 会导致通用 GDI 错误。
如何在不锁定每个线程的情况下使用工具锁定 .Save(...) 调用(例如使用 lock 关键字)
我想到了一个手工制作的解决方案,其中处理程序将文件名写入查找表,然后写入文件。其他处理程序需要检查查找,然后执行一些 Thread.Sleep 或类似操作。但这看起来确实像资源锁定的幼稚方法。
对于这种锁定“虚拟”资源的自定义锁,是否有适当的方法?(虚拟的,因为它在锁定时可能不存在)。
更新和编辑: 图像生成执行一些数字运算,因此包含在任务中。一个典型的场景是总是同时创建多个图像以利用 Thread.Pool。我知道作业队列可以解决问题,但它会删除并行执行。如果我手动将作业分配给 n 线程(这意味着编写我自己的池,对吗?)我仍然会遇到两个线程可能尝试写入同一个文件的问题。
事件源是不可靠的,因此它可能会使用同一个文件多次调用写入操作,但实际上只要一个“图像 A”生成正在工作或尚未开始第二个、第三个或任何事件处理都可以忽略。