我正在努力:
当只有1个线程正在运行时,这可以正常工作。当我添加多个线程时,我收到此错误...
该进程无法访问文件'C:\ someimage.jpg',因为它正由另一个进程使用。
以下是我正在使用的代码。运行此代码后,我运行上传方法。一旦完成,我尝试删除
using (var img = Image.FromFile(filename))
{
using (var newImage = ImageHandler.ScaleImage(img, 640, 960))
{
using (Graphics gra = Graphics.FromImage(newImage))
{
gra.DrawImage(img, new Rectangle(Point.Empty, new Size(640, 960)));
StringFormat sf = new StringFormat()
{
Alignment = StringAlignment.Center
};
gra.DrawString(text, new Font("Helvetica", 32), Brushes.White, new RectangleF(0, newImage.Height / 2, newImage.Width, newImage.Height), sf);
temp_filename = AppDomain.CurrentDomain.BaseDirectory + "/temp/" + GenerateDateTimeNowStamp() + ".jpg";
newImage.Save(temp_filename);
}
}
}
//run upload method ...
//delete temp file
if(System.IO.File.Exists(temp_filename))
System.IO.File.Delete(temp_filename);
答案 0 :(得分:2)
我总是使用Guid.NewGuid().ToString()
来创建我的临时文件名,然后它们就不会发生冲突......
var tempFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory , "temp");
temp_filename = Path.Combine(tempFolder, Guid.NewGuid().ToString());
或
temp_filename = System.IO.Path.GetTempFileName();
哦,是的,我更喜欢使用path.Combine
答案 1 :(得分:1)
当只有1个线程正在运行时,这可以正常工作。当我添加超过1 线程我收到这个错误...
问题在于GenerateDateTimeNowStamp
方法。即使n
个线程调用GenerateDateTimeNowStamp
,它将在特定时间返回相同的值,多个线程最终使用相同的文件,这就是为什么你不能删除而另一个线程可能正在使用它(保存的一半)。
根据@Damien_The_Unbeliever的评论建议,我建议使用Path.GetTempFileName()