сохранить изображение в arrayList - PullRequest
2 голосов
/ 08 июля 2011

Вот что я пытаюсь сделать: Поток B загрузит некоторые изображения и сохранит их в общем ресурсе: Static ArrayList IMBuffer;Поток A возьмет изображение из IMBuffer и что-то с ним сделает.Вот что я получил:

Тема B:

// сделать что-то

                    System.Net.WebClient myWebClient = new System.Net.WebClient();
                   try
                      { myWebClient.DownloadFile(pth, "BufferImg"); }
                   catch
                      {  // some stuff }

                    // add new dled image to IMBuffer
                    fs = new FileStream("BufferImg", FileMode.Open, FileAccess.Read);
                    Image img = Image.FromStream(fs);
                    lock (IMBuffer)
                    { IMBuffer.Add(img); }
                    img.Dispose();

                    lock (IMRequest) { IMRequest.RemoveAt(0); }
                    myWebClient.Dispose();
                    //fs.Dispose();
                    //  File.Delete("BufferImg");

// сделать что-то еще

Тема A:

// do something
Image nextImg;
                lock (IMBuffer)
                {
                    nextImg = (Image)IMBuffer[0];
                    nextImg.Save(DLedIM);
                }
// do something else

и вот проблема, к которой я прибегаю;поскольку изображения в IMBuffer открывались с использованием файлового потока, при удалении потока строка: nextImg.Save (DLedIM);вызывает ошибку «файл был использован другим процессом».Однако, если fs.Dispose ();строка закомментирована, затем программа блокирует «BufferImg», в результате она не сможет загрузить изображение в «BufferImg» после первого раза.Что я должен сделать, чтобы решить эту проблему?Или есть более простой способ выполнить то, что я пытаюсь сделать?

Ответы [ 2 ]

0 голосов
/ 08 июля 2011

Вместо реализации вашего собственного многопоточного рабочего процесса производителя / потребителя (а затем его отладки), почему бы просто не использовать существующую потокобезопасную (нет, параллельную) очередь, предоставляемую .NET?Может сэкономить много проб и еще больше ошибок.

Подробности здесь: Потоковая реализация очереди блокировки в .NET

0 голосов
/ 08 июля 2011

Это должно работать:

byte[] buffer;
using (FileStream fs = new FileStream("BufferImg", FileMode.Open, FileAccess.Read))
{
    buffer = new byte[fs.Length];
    fs.Read(buffer, 0, (int)fs.Length);
}
using(Image img = Image.FromStream(new MemoryStream(buffer))
{
    //...
}

Используя MemoryStream вы избегаете необходимости удерживать FileStream - в этот момент изображение вообще не имеет никакого отношения к файлу, и, следовательно, у вас не должно быть проблем с блокировкой файла. *

...