我有这样的代码:
public void SaveImage(int Counter)
{
var task = Task.Factory.StartNew(() =>
{
var image = FinalImage;
if (image != null)
{
image.Save(FinalImageSaveLocation + "test" + Counter + ".bmp");
}
}, TaskCreationOptions.PreferFairness);
}
我有一个 for 循环使用下面类似的代码创建 x 数量的图像:
for(int i = 0; i < 100; i++)
{
Pencil.DrawImage(image, x, y); //Pencil is created at a initialisation stage
SaveImage(i); //by Pencil = Graphics.FromImage(FinalImage);
}
我认为通过将 SaveImage 方法作为一项任务可以加快处理速度,但我认为我得到的异常是因为循环的下一次迭代试图在 Save 发生时绘制到最终图像对象。我想我可以使用锁,但我担心这会减慢速度?
是否有修复或我应该删除任务?
最佳答案
的确,您不能同时从多个线程访问图像。你必须做一些同步。如果性能有问题,您可以执行以下技巧:
在您的保存方法中,锁定图像。保存到内存流,释放锁,最后保存到磁盘。 (因为磁盘 IO 非常慢)。
锁定部分仅在需要实际同步时才有用。由于 Bitmap 不是线程安全的,您首先不应使用多个线程访问它,因此同步应该不是问题。
关于c# - Bitmap.Save "Object is currently in use elsewhere"线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063404/