c# – 检索可用的连续内存

我必须生成大胖的大图像,比如150003000.我使用GDI,类Bitmap生成此图像.当然,有时候生成将失败,因为没有更多的内存来实例化Bitmap.我的目标是告知用户他们允许生成的图像的最大大小.该消息应如下所示:You tried to...

我必须生成大胖的大图像,比如15000×3000.我使用GDI,类Bitmap生成此图像.

当然,有时候生成将失败,因为没有更多的内存来实例化Bitmap.我的目标是告知用户他们允许生成的图像的最大大小.

该消息应如下所示:

You tried to generate an image of size 15000×3000, but there is not enough memory.
The maximum size available is 10000×3000, or 15000×1000.

创建消息的想法是这样的:

public bool CanCreateBitmap(Size size, out string message)
{
    long availableMemory = this.GetAvailableContiguousMemory();
    long bytesRequiered = (long)size.Width * size.Height * 32;

    if (availableMemory < bytesRequiered)
    {
        var sizeProposal1 = new Size(size.Width, (int)(availableMemory / (32 * size.Width)));
        var sizeProposal2 = new Size((int)(availableMemory / (32 * size.Height)), size.Height);

        message = string.Format("You tried to generate an image of size {0}, but there is not enough memory."
                + Environment.NewLine + "The maximum size available is {1}, or {2}."
                , size, sizeProposal1, sizeProposal2);

        return false;
    }
    else
    {
        message = "";
        return true;
    }
}

但我没有GetAvailableContiguousMemory()函数的代码.

有没有一种方法可以检索.Net中的连续内存?
我问正确的问题是为了实现我的目标吗?

解决方法:

这种通知是一种实际上并没有帮助用户的创可贴.他们真的想要创建那个大位图,而任意小的位图并不是他们想要的.如果你想要做到这一点,那么你需要调整VirtualQuery来遍历虚拟地址空间并找到尚未映射的块.

现在不再有这个问题,将项目的平台目标设置更改为AnyCPU,这样您的程序就可以使用64位操作系统上可用的虚拟内存空间.

本文标题为:c# – 检索可用的连续内存

基础教程推荐