2

これが私がやろうとしていることです: スレッド 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" にイメージをダウンロードできません。この問題を解決するにはどうすればよいですか? または、私がやろうとしていることを達成するためのより簡単な方法はありますか?

4

2 に答える 2

0

独自のマルチスレッドプロデューサー/コンシューマーワークフローを実装する(そしてそれをデバッグする必要がある)代わりに、.NETによって提供される既存のスレッドセーフ(いや、同時)キューを使用しないのはなぜですか?多くの試行錯誤とさらに多くのエラーを節約できます。

詳細はこちら:.NETでのスレッドセーフなブロッキングキューの実装

于 2011-07-08T04:22:04.220 に答える
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- この時点で、イメージはファイルにまったく接続されていないため、ファイルのロックに問題はありません。

于 2011-07-08T03:57:14.040 に答える