c# - 将图像存储在 arrayList 中

标签 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”。我应该怎么做才能解决这个问题?还是有更简单的方法来完成我想做的事情?

最佳答案

这应该有效:

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/

相关文章:

html - iOS 如何让背景看起来随时间改变亮度?

java - Android/Java - ListView 使用 ArrayList 填充 XML 数据 : Only Displays First Item

java - ArrayList 菜单 Java

c# - 第二个路径片段不能是驱动器或 UNC 名称 - 创建子目录错误

c# - 鼠标倾斜水平滚动在 DataGridView 中不起作用

c# - C# 中有长版本的 IntPtr 吗?

javascript - 当我使用 javascript 从网站保存图像时,如何将图像保存在我想要的本地路径中?

c# - 使用数组信息填充组合框

html - 如何在 css 中使最大宽度固有或初始(以先到者为准)?

java - OpenGL (ES) -- 当新对象添加到 ArrayList 时,多边形会暂时消失