c# - Bitmap.Save "Object is currently in use elsewhere"线程问题

标签 c# .net gdi+ gdi system.drawing

我有这样的代码:

    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/

相关文章:

c# - 如何使用 Roslyn 检测代码中的闭包?

c# - GDI+ 中的非缩放笔

c# - GDI+ 区域、矩阵和 GraphicsPath 处理

c# - 在 C# 中将字典作为参数传递给 Http.Post

c# - Entity Framework 6 异步操作和 TranscationScope

c# - 如何使用代码优先迁移来更新数据库?

c# - 父类中的枚举属性应该在派生类中更改

.net - MEF 和 Unity 之间以及用途有何不同?

c# - 日期时间支持的格式化语言?

c++ - GDI Sprite 显示一段时间后消失