簡體   English   中英

如何避免.NET CF 3.5和CE 6 R3中出現嚴重錯誤

[英]How to avoid a serious error in .NET CF 3.5 and CE 6 R3

當我在帶有附加調試器的設備上啟動此示例程序時,會發生嚴重錯誤。

這是我們實際應用程序中發生的簡化版本。

我發現的是:

  • 必須附加調試器
  • 必須以某種方式填充內存(我認為這將強制垃圾收集)
  • 垃圾(位圖)對象必須存在。 其他對象可能會導致相同的錯誤
  • 必須顯示一個表單(如果使用Application.Run()或ShowDialog則沒有區別)

然后,當表單可見並且GC收集位圖時,會發生嚴重錯誤。

我正在使用.NET Compact Framework 3.5運行WindowsCE 6 R3。

static class Program {

    static void Main() {
        // Fill up memory - Depends on device
        var memory = new int[100000 * 150];

        // Settings the priority higher will raise the error earlier.
        // With Priority set to Normal the EXE won't get freed correct.
        // Without this line i have to reboot the CE after every test run...
        Thread.CurrentThread.Priority = ThreadPriority.Highest;

        // 80 is just random choosen. The error occurs also with 30 Bitmaps...
        for (int o = 1; o < 80; o++) {
            // Create a Bitmap and don't free it manually. The
            // The garbage collector will take care of it :)
            var bitmap = new Bitmap(100, 100);

            // When i dispose the Bitmap, everything works fine...
            //bitmap.Dispose();
        }

        // Force a GC run
        System.Diagnostics.Debug.WriteLine(GC.GetTotalMemory(true));

        // Then error occurs when the form is shown.
        System.Windows.Forms.Application.Run(new System.Windows.Forms.Form());
    }
}

我已經找到了類似的問題,但沒有回答......

到目前為止我嘗試過的事情:

  • 手動清理所有資源。 我已經搜索了所有位圖創建並處理或緩存它們。 錯誤仍然存​​在,不僅是Bitmaps不好......

我有一個理論,那就是系統交換。 如果調試器試圖檢索自己大小超過CE的分頁池大小的變量的內容,我可以想象這會死鎖。 調試器停止系統讀取數據,但系統無法提供內容,因為它無法交換數據。 使用IOCTL_HAL_GET_POOL_PARAMETERS,您應該能夠檢測系統是否正在交換。

這很難說明問題的答案。

當你說, a serious error occurs ,我的猜測是你看到一個OutOfMemoryException

垃圾收集器 (GC)在框架分配時間到GC或調用它時運行。

如果您創建/使用內存的速度比Framework能夠調用GC的速度快,則可能會耗盡內存 - 尤其是在CF應用程序中。

上面的MSDN鏈接說明如下:

.NET Framework的垃圾收集器管理應用程序的內存分配和釋放。 每次使用new運算符創建對象時,運行時都會從托管堆中為對象分配內存。 只要托管堆中的地址空間可用,運行時就會繼續為新對象分配空間。 但是,記憶並不是無限的。 最終垃圾收集器必須執行一個集合才能釋放一些內存。 垃圾收集器的優化引擎根據正在進行的分配確定執行收集的最佳時間。 當垃圾收集器執行集合時,它會檢查托管堆中不再被應用程序使用的對象,並執行必要的操作來回收其內存。

要解決這個問題,您需要在完成資源后釋放資源。 如果您稍后需要該數據,可以將資源保存到某種介質(閃存數據,硬盤驅動器等)以便以后檢索。

有關這方面的更多信息,您可以閱讀Steven Pratschner的博客,題為“.Net Compact Framework垃圾收集器概述”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM