这是我正在尝试做的事情:线程 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”。我应该怎么做才能解决这个问题?还是有更简单的方法来完成我想做的事情?
最佳答案
这应该有效:
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
- 此时图像与文件根本没有任何连接,因此您应该文件锁定没有任何问题。
关于c# - 将图像存储在 arrayList 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6619743/