简体   繁体   中英

image file is not released after it is disposed

I am working on a project that downloads some images and put them in a arrarList to be processed later. The following portion of code is where the problem is. It works with first download, but somehow the file images were saving to is locked up after the first download. I can't seems to find a way to unlock it. File.Delete("BufferImg"); is giving error saying the file is been used by another process when "BufferImg" was not used anywhere else of the program. What am I doing wrong?

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;

}

The following line is why the image is not being released:

IMBuffer.Add(img.Clone());

When you clone something loaded through a resource (file), the file is still attached to the cloned object. You will have to use a FileStream, like so:

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();

This should release the file after you've loaded it in the buffer.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM