我理解这个问题可能太笼统了。但是我尝试了很多东西,但我无法弄清楚如何解决这个问题。
我正在使用 ConcurrentQueue 进行多线程操作。一个线程正在从服务器下载图像并将其保存到队列中。这是代码:
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);
}
}
}
}
我从 Button_Click() 调用这两个线程,如下所示:
Thread DownloadThread = new Thread(DownloadImage);
DownloadThread.Start();
Thread SaveThread = new Thread(SaveImage);
SaveThread.Start();
每当队列达到 68 个计数时,我都会收到 MemoryFull 错误。我不确定如何避免这种情况。我尝试使用 Thread.Sleep 来避免这种情况。例如,我试过:循环Thread.Sleep(500)
之后。foreach
每当我在里面尝试它时,foreach
它在任何给定点上都可以正常工作ImageQueue.Count = 1
。我哪里错了?