System.Drawing.dll中的内存不足异常

时间:2016-12-17 20:25:51

标签: c# .net memory bitmap resources

我的代码是从dll加载.resx文件中的资源。它将资源加载到大约40左右,然后开始抛出内存异常。任何人都可以向我解释为什么会这样吗?以及如何解决它?

编辑:

我通过将解决方案中的所有项目更改为64位解决了我的问题。

由于

    /// <summary>
    /// Loads all default resources.
    /// </summary>
    /// <returns></returns>
    private static List<Bitmap> LoadAllInternalResources()
    {
        List<Bitmap> Ret = new List<Bitmap>();

        #region Spades

        Ret.Add(MainResources.MainResources._50);

        Ret.Add(MainResources.MainResources._46);

        Ret.Add(MainResources.MainResources._12);

        Ret.Add(MainResources.MainResources._38);

        Ret.Add(MainResources.MainResources._34);

        Ret.Add(MainResources.MainResources._30);

        Ret.Add(MainResources.MainResources._26);

        Ret.Add(MainResources.MainResources._22);

        Ret.Add(MainResources.MainResources._18);

        Ret.Add(MainResources.MainResources._14);

        Ret.Add(MainResources.MainResources._10);

        Ret.Add(MainResources.MainResources._6);

        Ret.Add(MainResources.MainResources._2);

        #endregion Spades

        #region Clubs

        Ret.Add(MainResources.MainResources._49);

        Ret.Add(MainResources.MainResources._45);

        Ret.Add(MainResources.MainResources._41);

        Ret.Add(MainResources.MainResources._37);

        Ret.Add(MainResources.MainResources._33);

        Ret.Add(MainResources.MainResources._29);

        Ret.Add(MainResources.MainResources._25);

        Ret.Add(MainResources.MainResources._21);

        Ret.Add(MainResources.MainResources._17);

        Ret.Add(MainResources.MainResources._13);

        Ret.Add(MainResources.MainResources._9);

        Ret.Add(MainResources.MainResources._5);

        Ret.Add(MainResources.MainResources._1);

        #endregion Clubs

        #region Hearts

        Ret.Add(MainResources.MainResources._51);

        Ret.Add(MainResources.MainResources._47);

        Ret.Add(MainResources.MainResources._43);

        Ret.Add(MainResources.MainResources._39);

        Ret.Add(MainResources.MainResources._35);

        Ret.Add(MainResources.MainResources._31);

        Ret.Add(MainResources.MainResources._27);

        Ret.Add(MainResources.MainResources._23);

        Ret.Add(MainResources.MainResources._19);

        Ret.Add(MainResources.MainResources._15);

        Ret.Add(MainResources.MainResources._11);

        Ret.Add(MainResources.MainResources._7);

        Ret.Add(MainResources.MainResources._3);

        #endregion Hearts

        #region Diamonds

        Ret.Add(MainResources.MainResources._52);

        Ret.Add(MainResources.MainResources._48);

        Ret.Add(MainResources.MainResources._44);

        Ret.Add(MainResources.MainResources._40);

        Ret.Add(MainResources.MainResources._36);

        Ret.Add(MainResources.MainResources._32);

        Ret.Add(MainResources.MainResources._28);

        Ret.Add(MainResources.MainResources._24);

        Ret.Add(MainResources.MainResources._20);

        Ret.Add(MainResources.MainResources._16);

        Ret.Add(MainResources.MainResources._12);

        Ret.Add(MainResources.MainResources._8);

        Ret.Add(MainResources.MainResources._4);

        #endregion Diamonds

        #region Jokers

        Ret.Add(MainResources.MainResources._54);

        Ret.Add(MainResources.MainResources._53);

        #endregion Jokers

        return Ret;
    }

2 个答案:

答案 0 :(得分:0)

您的计算机没有足够的内存来加载所有这些位图。你需要同时加载它们吗?

以下是解决此问题的一些方法:

  1. 也许在需要时加载它们,并在不需要它们时丢弃它们。一次做几件事。 File.ReadLines使用了类似的方法。它返回IEnumberable,当您遍历它时,它一次读取一行。 File.ReadAllLines会将整个文件读入内存。因此,如果您有一个4GB的文件,每行50KB,File.ReadLines一次读取50KB。 File.ReadAllLines将整个4GB读入内存。 (这些数字是任意选择的)。因此,在32位机器上,File.ReadAllLines会导致内存不足,但File.ReadLines可能不会在整个枚举器上调用ToList()
  2. 您可能想要缩略图,以便可以加载更多缩略图,然后在需要高质量图像时加载实际图像。
  3. 增加机器的RAM。 (虽然这不是我推荐的解决方案)。

答案 1 :(得分:0)

要解决我的问题,我所要做的就是将项目设置更改为64位,而不是32位。