【问题标题】:Insufficient memory to continue the execution of the program when trying to initialize array of InkCanvas in UWP尝试在 UWP 中初始化 InkCanvas 数组时内存不足,无法继续执行程序
【发布时间】:2023-03-22 19:24:02
【问题描述】:

这是我的代码:

    public sealed partial class MainPage : Page
{
    InkCanvas[] arrInkCanvas = null;
    public MainPage()
    {
        this.InitializeComponent();

        int i = 0;

        arrInkCanvas = new InkCanvas[1000];
        try
        {
            for (i = 0; i < 1000; i++)
            {                    
                arrInkCanvas[i] = new InkCanvas();
            }
        }
        catch (Exception ex)
        {

        }
    }
}

当我在 WPF 应用程序中运行此代码时没有问题,但在 UWP 中它会抛出异常:“内存不足,无法继续执行程序。”

是错误还是任何人都可以告诉我的?

谢谢。

【问题讨论】:

  • 我想说问题很明显:尝试创建 1000 个新的 InkCanvas 对象超出了设备的内存。
  • 我在我的电脑上运行这个应用程序,当 i = 128 并且内存消耗为 50MB 时异常中断,我认为问题不是设备的内存。
  • 设备的内存是多少?我想您正在使用 512mb 的虚拟设备,也许这就是问题所在。正在研究...
  • 我是在本地机器上运行的,加载一堆图片消耗1GB内存没有问题。

标签: c# wpf uwp


【解决方案1】:

Windows 操作系统将根据 RAM 和操作系统配置平衡位于应用程序的内存。您可以通过 MemoryManager(正如 cFrozenDeath 所说)通过以下方式检查您的应用程序的内存配置:

 public MainPage()
 {
     this.InitializeComponent();

     var AppUsageLevel = MemoryManager.AppMemoryUsageLevel;
     var AppMemoryLimit = MemoryManager.AppMemoryUsageLimit;
  }

根据我的测试,您的应用确实内存不足。可以做一个简单的测试:在for循环中,每次new InkCanvas(),都可以调用MemoryManager.AppMemoryUsage,并与MemoryManager.AppMemoryUsageLimit进行比较。 p>

如果您有任何具体原因以这种方式创建 UIElment,能否告诉我? Win10 1.586 确实提供了一个新的 API TrySetAppMemoryUsageLimit 来设置应用程序的内存限制。但是,根据内部讨论,该 API 目前仅适用于非常有限的场景,例如移动设备上的 VOIP 应用程序。而且这个 API 的示例代码和文档还没有准备好。

【讨论】:

    【解决方案2】:

    查看它,there is another post 看起来很相似,这表明限制可能是 128... 这可能是“设计”的限制

    如果这是一致的 - 我还没有尝试过 - 为什么不创建一个 InkCanvas 池并在不使用 InkCanvas 时重新使用它们?除非你同时需要它们... 这也会增加速度,因为您可以避免重新创建 inkcanvas 并重复使用它们。

    到目前为止,代码可以保持一致,当问题/限制得到修复时,您可以扩大池..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多