using(Bitmap) 偶尔并行抛出异常
using(Bitmap) occasionally throwing exception in parallel
我正在尝试一次从街景全景图下载并保存多个 bmp。它在正常的 for 循环中与 Panorama() 一起工作正常,但是当我把它放在 Parallel.For 中时,它会在大约 20 张图像后抛出异常,其中 using (Bitmap result = new Bitmap(26 * 512, 13 * 512))
被突出显示,参数无效异常。崩溃时内存使用量为 4GB,但这应该不是问题,因为我有 16GB 的 RAM。
这是我的代码:
public static void AllPanoramas((double Lat, double Lon)[] locData, string folderPath, ImageFormat format)
{
ServicePointManager.DefaultConnectionLimit = Environment.ProcessorCount * 12;
string[] panoIDs = new string[locData.Length];
Parallel.For(0, locData.Length, i =>
{
panoIDs[i] = Web.GetPanoID(locData[i], 50);
});
Parallel.For(0, panoIDs.Length, i =>
{
Panorama(panoIDs[i], folderPath + @"\image" + i + "." + format.ToString().ToLower(), format);
});
}
public static void Panorama(string panoID, string file, ImageFormat format)
{
Image[,] images = new Image[26, 13];
Parallel.For(0, 26, x => {
Parallel.For(0, 13, y =>{
using (WebClient client = new WebClient())
images[x, y] = Image.FromStream(new MemoryStream(client.DownloadData(Get.TileURL(panoID, x, y))));
});
});
using (Bitmap result = new Bitmap(26 * 512, 13 * 512))
{
for (int x = 0; x < 26; x++)
for (int y = 0; y < 13; y++)
using (Graphics g = Graphics.FromImage(result))
g.DrawImage(images[x, y], x * 512, y * 512);
result.Save(file, format);
}
}
我不确定是什么原因导致了这个问题,因此非常感谢您的帮助。
原因是我构建的是 32 位,这意味着我可以使用的最大内存是 4GB。将其更改为 64 位解决了问题。
我正在尝试一次从街景全景图下载并保存多个 bmp。它在正常的 for 循环中与 Panorama() 一起工作正常,但是当我把它放在 Parallel.For 中时,它会在大约 20 张图像后抛出异常,其中 using (Bitmap result = new Bitmap(26 * 512, 13 * 512))
被突出显示,参数无效异常。崩溃时内存使用量为 4GB,但这应该不是问题,因为我有 16GB 的 RAM。
这是我的代码:
public static void AllPanoramas((double Lat, double Lon)[] locData, string folderPath, ImageFormat format)
{
ServicePointManager.DefaultConnectionLimit = Environment.ProcessorCount * 12;
string[] panoIDs = new string[locData.Length];
Parallel.For(0, locData.Length, i =>
{
panoIDs[i] = Web.GetPanoID(locData[i], 50);
});
Parallel.For(0, panoIDs.Length, i =>
{
Panorama(panoIDs[i], folderPath + @"\image" + i + "." + format.ToString().ToLower(), format);
});
}
public static void Panorama(string panoID, string file, ImageFormat format)
{
Image[,] images = new Image[26, 13];
Parallel.For(0, 26, x => {
Parallel.For(0, 13, y =>{
using (WebClient client = new WebClient())
images[x, y] = Image.FromStream(new MemoryStream(client.DownloadData(Get.TileURL(panoID, x, y))));
});
});
using (Bitmap result = new Bitmap(26 * 512, 13 * 512))
{
for (int x = 0; x < 26; x++)
for (int y = 0; y < 13; y++)
using (Graphics g = Graphics.FromImage(result))
g.DrawImage(images[x, y], x * 512, y * 512);
result.Save(file, format);
}
}
我不确定是什么原因导致了这个问题,因此非常感谢您的帮助。
原因是我构建的是 32 位,这意味着我可以使用的最大内存是 4GB。将其更改为 64 位解决了问题。