WPF多个控件OutOfMemory
WPF multiple controls OutOfMemory
我自己做了一个控件来"fake"一个细节网格。每一行都是一个控件,这意味着我需要很多。我正在尝试将它们存储在位于 ScrollViewer 中的 StackPanel 中。
当我添加一个控件时,我的可执行文件的内存使用量上升了 10mb。当我尝试使用它绘制所有 110 个数据包时,它上升到 1.5GB 并抛出 OutOfMemory 异常。
控件非常简约。没有执行,只有几个标签、一些矢量图形、一个扩展器和另外一组 3 个控件(只有多个标签)。
我该如何解决这个问题?
您似乎是想为每个单元格设置一个特定的模板。您应该使用项目控件及其模板来帮助您实现这一目标,请查看此处 is there a datatemplate for grid panel elements in WPF?, here WPF - Display single entity with a data template and here ItemsControl ItemTemplate Binding 的示例以及有关如何使用它们的更多信息。
作为快速修复,您可以尝试此代码,它会立即释放内存
/// <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);
}
我自己做了一个控件来"fake"一个细节网格。每一行都是一个控件,这意味着我需要很多。我正在尝试将它们存储在位于 ScrollViewer 中的 StackPanel 中。
当我添加一个控件时,我的可执行文件的内存使用量上升了 10mb。当我尝试使用它绘制所有 110 个数据包时,它上升到 1.5GB 并抛出 OutOfMemory 异常。
控件非常简约。没有执行,只有几个标签、一些矢量图形、一个扩展器和另外一组 3 个控件(只有多个标签)。
我该如何解决这个问题?
您似乎是想为每个单元格设置一个特定的模板。您应该使用项目控件及其模板来帮助您实现这一目标,请查看此处 is there a datatemplate for grid panel elements in WPF?, here WPF - Display single entity with a data template and here ItemsControl ItemTemplate Binding 的示例以及有关如何使用它们的更多信息。
作为快速修复,您可以尝试此代码,它会立即释放内存
/// <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);
}