图像文件在处理后不会被释放

时间:2011-07-05 22:07:17

标签: c# image file-locking webclient-download

我正在开发一个项目,该项目会下载一些图像并将它们放在arrarList中以便稍后处理。代码的以下部分是问题所在。它适用于第一次下载,但不知何故保存的文件图像在第一次下载后被锁定。我似乎找不到解锁它的方法。 File.Delete( “BufferImg”);当程序的任何其他位置没有使用“BufferImg”时,该错误表示该文件已被另一个进程使用。我究竟做错了什么?

int attempcnt=0; 
if (ok)
 {
     System.Net.WebClient myWebClient = new System.Net.WebClient();
     try
     {
         myWebClient.DownloadFile(pth, "BufferImg");
         lock (IMRequest) { IMRequest.RemoveAt(0); }
         attempcnt = 0;
     }
     catch   // will attempcnt 3 time before it remove the request from the queue
     {
         attempcnt++;
         myWebClient.Dispose();
         myWebClient = null;
         if(attempcnt >2)
         {
             lock (IMRequest) { IMRequest.RemoveAt(0); }
             attempcnt = 0;
         }
         goto endofWhile;
     }
     myWebClient.Dispose();
     myWebClient = null;
     using (Image img = Image.FromFile("BufferImg"))
     {
         lock (IMBuffer)
         {
             IMBuffer.Add(img.Clone());
             MessageBox.Show("worker filled: " + IMBuffer.Count.ToString() + ": " + pth);
         }
         img.Dispose();
     }
 }
endofWhile:
 File.Delete("BufferImg");
 continue;

}

1 个答案:

答案 0 :(得分:0)

以下行是图片未发布的原因:

IMBuffer.Add(img.Clone());

当您克隆通过资源(文件)加载的内容时,该文件仍附加到克隆对象。你必须使用FileStream,如下所示:

FileStream fs = new FileStream("BufferImg", FileMode.Open, FileAccess.Read);
using (Image img = Image.FromStream(fs))
{
    lock (IMBuffer)
    {
        IMBuffer.Add(img);
        MessageBox.Show("worker filled: " + IMBuffer.Count.ToString() + ": " + pth);
    }
}
fs.Close();

这应该在将文件加载到缓冲区后释放文件。