WPF多个控件OutOfMemory

本文关键字:OutOfMemory 控件 WPF | 更新日期: 2023-09-27 18:01:35

我自己做了一个控件来"伪造"一个细节网格。每一行都是一个控件,这意味着我需要很多控件。我试图将它们存储在位于ScrollViewer的StackPanel中。

当我添加一个控件时,我的可执行文件的内存使用量上升了10mb。当我试图使用绘制所有110个数据包时,它正在爬升到1.5GB并抛出OutOfMemory异常。

控件非常简约。没有执行,只有几个标签,一些矢量图形,一个扩展器和一组3个以上的控件(只有多个标签)。

我该如何解决这个问题?

WPF多个控件OutOfMemory

作为快速修复,您可以尝试以下代码,它将立即释放内存

 /// <summary>
    /// Memory Management
    /// </summary>
    public class MemoryManagement
    {
        /// <summary>
        /// Clear un wanted memory
        /// </summary>
        public static void FlushMemory()
        {
            try
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                {
                    SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                }
            }
            catch (Exception e)
            {
            }
        }
        /// <summary>
        /// set process working size
        /// </summary>
        /// <param name="process">Gets process</param>
        /// <param name="minimumWorkingSetSize">Gets minimum working size</param>
        /// <param name="maximumWorkingSetSize">Gets maximum working size</param>
        /// <returns>Returns value</returns>
        [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet =
          CharSet.Ansi, SetLastError = true)]
        private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
    }

似乎你要做的是为每个单元格都有一个特定的模板。你应该使用项目控件和它们的模板来帮助你实现这一点,看看这里,在WPF中有网格面板元素的数据模板吗?,这里是WPF -显示单个实体与数据模板,这里是ItemsControl ItemTemplate绑定示例以及如何使用它们的更多信息。