2

这是我想做的事情:线程 B 将下载一些图像并将这些图像存储在共享资源中:静态 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”。我应该怎么做才能解决这个问题?或者有没有更简单的方法来完成我想做的事情?

4

2 回答 2

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))
{
    //...
}

使用 aMemoryStream您避免必须坚持FileStream- 此时图像与文件根本没有任何连接,因此您不应该对文件锁定有任何问题。

于 2011-07-08T03:57:14.040 回答
0

与其实现自己的多线程生产者/消费者工作流程(然后必须对其进行调试),不如直接使用 .NET 提供的现有线程安全(不,并发)队列?可以为您节省大量的试验甚至更多的错误。

此处的详细信息:.NET 上的线程安全阻塞队列实现

于 2011-07-08T04:22:04.220 回答