以下是我要做的事情:线程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”。我该怎么做才能解决这个问题?或者有更简单的方法来完成我想要做的事情吗?
答案 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)队列,而不是实现自己的多线程生产者/消费者工作流(然后必须调试它)?可以为你节省大量的试验,甚至更多的错误。