使用(位图)偶尔并行抛出异常

时间:2019-07-19 10:39:03

标签: c# image parallel-processing bitmap panoramas

我正在尝试一次从街景全景图中下载并保存多个bmp。在正常的for循环中,它可以与Panorama()一起正常工作,但是当我将其放在Parallel中时。因为它在大约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);
        }
    }

我不确定是什么原因导致了此问题,因此我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

这样做的原因是我以32位构建,这意味着我可以使用的最大内存为4GB。将其更改为64位可以解决该问题。