файл изображения не освобождается после его утилизации - PullRequest
0 голосов
/ 06 июля 2011

Я работаю над проектом, который загружает некоторые изображения и помещает их в 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 голосов
/ 06 июля 2011

Следующая строка - почему изображение не публикуется:

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

Это должно освободить файл после того, как вы загрузили его в буфер.

...