将数据存储在arrayList中

时间:2011-07-08 03:40:08

标签: c# image arraylist filestream file-locking

以下是我要做的事情:线程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 :(得分:0)

这应该有效:

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 - 此时图像与文件完全没有任何连接,因此您不应该对文件有任何问题锁定。

答案 1 :(得分:0)

为什么不使用.NET提供的现有线程安全(nay,concurrent)队列,而不是实现自己的多线程生产者/消费者工作流(然后必须调试它)?可以为你节省大量的试验,甚至更多的错误。

详细信息:Thread-safe blocking queue implementation on .NET