この質問は一般的すぎるかもしれません。しかし、私は多くのことを試しましたが、これを解決する方法を理解できません。
マルチスレッド操作に ConcurrentQueue を使用しています。1 つのスレッドがサーバーから画像をダウンロードし、キューに保存しています。そのためのコードは次のとおりです。
public static void DownloadImage()
{
string baseUrl = "http://someurl";
//int numIterations = 5;
HttpWebRequest request = null;
foreach (var fileName in fileNames)
{
string url = string.Format(baseUrl, fileName);
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/x-www-form-urlencoded";
var response = (HttpWebResponse)request.GetResponse();
Stream stream = response.GetResponseStream();
img = Image.FromStream(stream);
ImageFileName FileNameImage = new ImageFileName(fileName, img);
ImageQueue.Enqueue(FileNameImage);
Console.WriteLine("Count after Enqueue: {0}", ImageQueue.Count);
}
そして、別のスレッドがキューから画像を取得し、宛先フォルダーに保存します。そのためのコードは次のとおりです。
public static void SaveImage()
{
while (true)
{
if (!ImageQueue.IsEmpty)
{
foreach (var newobject2 in ImageQueue)
{
Image img2 = newobject2.Image;
img2.Save("C:\\path" + newobject2.ImageName);
ZoomThumbnail = img2;
ZoomSmall = img2;
ZoomLarge = img2;
ZoomThumbnail = GenerateThumbnail(ZoomThumbnail, 86, false);
ZoomSmall = GenerateThumbnail(ZoomSmall, 400, false);
ZoomLarge = GenerateThumbnail(ZoomLarge, 1200, false);
ZoomThumbnail.Save("C:\\path" + newobject2.ImageName + "_Thumb.jpg");
ZoomSmall.Save("C:\\path" + newobject2.ImageName + "_ZoomSmall.jpg");
ZoomLarge.Save("C:\\path" + newobject2.ImageName + "_ZoomLarge.jpg");
ImageFileName imgobject3 = new ImageFileName();
ImageQueue.TryDequeue(out imgobject3);
Console.WriteLine("Count after Deque: {0}", ImageQueue.Count);
}
}
}
}
この 2 つのスレッドを Button_Click() から次のように呼び出しています。
Thread DownloadThread = new Thread(DownloadImage);
DownloadThread.Start();
Thread SaveThread = new Thread(SaveImage);
SaveThread.Start();
キューのカウントが 68 に達するたびに MemoryFull エラーが発生します。これを回避する方法がわかりません。これを回避するために Thread.Sleep を使用してみました。たとえば、私が試したのは: Thread.Sleep(500)
after foreach
loop. 内部foreach
で試してみると、どの時点でもまったく問題なく動作しますImageQueue.Count = 1
。どこが間違っていますか?