【发布时间】:2011-12-25 04:36:08
【问题描述】:
我有一些这样的代码:
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 发生时绘制到最终图像对象。我想我可以使用锁,但我担心这会减慢速度?
有修复方法还是我应该删除任务?
【问题讨论】:
-
Bitmap 类不是线程安全的,因此您不能同时从多个线程访问它。如果这意味着您必须锁定、阻止它或制作一份您可以在自己的时间保存的副本,您只需要选择一个解决方案并使用它,但您绝对不能从多个线程访问它。您还提到您在保存时正在使用它。您是否保存渲染图像?如果是这样,您可能最终应该得到一个锁或一个队列,或者您最终可能会以比它们完成的速度更快的速度结束任务。
标签: c# .net gdi+ gdi system.drawing