gpt4 book ai didi

c# - WPF 应用程序中的 TextBox.Text 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 13:11:41 29 4
gpt4 key购买 nike

我有一个对数字数组进行大量数字运算的应用程序。我将其设置为每 100,000 次操作显示这些数字的状态。这只是对运算符(operator)的一种视觉指示,表明应用程序仍在处理中,以及距离完成还有多远。

应用程序运行几个小时后,它因 OutOfMemoryExeption 而崩溃。我在上面运行了 CLRProfiler,发现泄漏发生在显示数组当前状态的 TextBox 中……每次界面更新时,应用程序都会在 Char[] 中构建 ~4K,每个挂起位的堆栈跟踪内存是一样的。

这是 WPF 中的错误,还是我不知道应该做些什么来防止这种情况发生?我没有看到任何其他对此的引用。由于无论如何这是一个处理器密集型操作,如果我不需要只显示数组的当前状态,我宁愿不必销毁和重建 TextBox。

这是我能找到的唯一内存泄漏,但由于所需的操作数量庞大,这对应用程序来说实际上是一个大问题,即使我只是简单地降低界面更新的频率。如果您需要更多信息,我会尽可能提供帮助,但请理解,由于此应用程序的功能,我几乎无法发布任何源代码,并且我将不得不匿名化任何内容(删除任何指示应用程序的目的),我可以发布。

当通过 CLR Profiler 运行时,这会显着降低性能,以下相同的跟踪每 2 秒出现一次(记住:100,000 次操作)并且内存永远不会被释放。当它在没有附加分析器的情况下运行时,更新之间的时间小于 1 秒。

一次更新(“谁分配”)的跟踪是:

<root> :  3.7 kB    (100.00%)
WpfApplication0.App::Main static void (): 3.7 kB (100.00%)
System.Windows.Application::Run int32 (): 3.7 kB (100.00%)
System.Windows.Application::Run int32 (System.Windows.Window): 3.7 kB (100.00%)
System.Windows.Application::RunInternal int32 (System.Windows.Window): 3.7 kB (100.00%)
System.Windows.Application::RunDispatcher Object (Object): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::Run static void (): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::PushFrame static void (System.Windows.Threading.DispatcherFrame): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::PushFrameImpl void (System.Windows.Threading.DispatcherFrame): 3.7 kB (100.00%)
NATIVE FUNCTION ( UNKNOWN ARGUMENTS ): 3.7 kB (100.00%)
MS.Win32.HwndSubclass::SubclassWndProc int_ptr (int_ptr int32 int_ptr int_ptr): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::Invoke Object (System.Windows.Threading.DispatcherPriority Object): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::InvokeImpl Object (System.Windows.Threading.DispatcherPriority Object bool): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::WrappedInvoke Object ( Object bool ): 3.7 kB (100.00%)
System.Windows.Threading.ExceptionWrapper::TryCatchWhen Object (Object Object bool ): 3.7 kB (100.00%)
System.Windows.Threading.ExceptionWrapper::InternalRealCall Object ( Object bool): 3.7 kB (100.00%)
MS.Win32.HwndSubclass::DispatcherCallbackOperation Object (Object): 3.7 kB (100.00%)
MS.Win32.HwndWrapper::WndProc int_ptr (int_ptr int32 int_ptr int_ptr bool&): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::WndProcHook int_ptr (int_ptr int32 int_ptr int_ptr bool&): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::ProcessQueue void (): 3.7 kB (100.00%)
System.Windows.Threading.DispatcherOperation::Invoke Object (): 3.7 kB (100.00%)
System.Threading.ExecutionContext::Run static void (System.Threading.ExecutionContext System.Threading.ContextCallback Object): 3.7 kB (100.00%)
System.Threading.ExecutionContext::RunInternal static void (System.Threading.ExecutionContext System.Threading.ContextCallback Object): 3.7 kB (100.00%)
System.Threading.ExecutionContext::runTryCode static void (Object): 3.7 kB (100.00%)
System.Windows.Threading.DispatcherOperation::InvokeInSecurityContext static void (Object): 3.7 kB (100.00%)
System.Windows.Threading.DispatcherOperation::InvokeImpl void (): 3.7 kB (100.00%)
System.Windows.Threading.Dispatcher::WrappedInvoke(1) Object ( Object bool ): 3.7 kB (100.00%)
System.Windows.Threading.ExceptionWrapper::TryCatchWhen(1) Object (Object Object bool ): 3.7 kB (100.00%)
System.Windows.Threading.ExceptionWrapper::InternalRealCall(1) Object ( Object bool): 3.7 kB (100.00%)
System.Delegate::DynamicInvokeImpl Object (Object[]): 3.7 kB (100.00%)
System.Reflection.RuntimeMethodInfo::Invoke Object (Object System.Reflection.BindingFlags System.Reflection.Binder Object[] System.Globalization.CultureInfo bool): 3.7 kB (100.00%)
System.RuntimeMethodHandle::InvokeMethodFast Object (Object Object[] System.Signature System.Reflection.MethodAttributes System.RuntimeTypeHandle): 3.7 kB (100.00%)
WpfApplication0.Window1::UpdateUI void (): 3.7 kB (100.00%)
System.Windows.Controls.TextBox::set_Text void (String): 3.7 kB (100.00%)
System.Windows.DependencyObject::SetValue void (System.Windows.DependencyProperty Object): 3.7 kB (100.00%)
System.Windows.DependencyObject::SetValueCommon void (System.Windows.DependencyProperty Object System.Windows.PropertyMetadata bool System.Windows.OperationType bool): 3.7 kB (100.00%)
System.Windows.DependencyObject::UpdateEffectiveValue System.Windows.UpdateResult (System.Windows.EntryIndex System.Windows.DependencyProperty System.Windows.PropertyMetadata System.Windows.EffectiveValueEntry System.Windows.EffectiveValueEntry& bool System.Windows.OperationType): 3.7 kB (100.00%)
System.Windows.DependencyObject::NotifyPropertyChange void (System.Windows.DependencyPropertyChangedEventArgs): 3.7 kB (100.00%)
System.Windows.Controls.TextBox::OnPropertyChanged void (): 3.7 kB (100.00%)
System.Windows.FrameworkElement::OnPropertyChanged void (): 3.7 kB (100.00%)
System.Windows.DependencyObject::OnPropertyChanged void (System.Windows.DependencyPropertyChangedEventArgs): 3.7 kB (100.00%)
System.Windows.Controls.TextBox::OnTextPropertyChanged static void ( ): 3.7 kB (100.00%)
System.Windows.Documents.TextContainer::DeleteContentInternal void (System.Windows.Documents.TextPointer System.Windows.Documents.TextPointer): 3.7 kB (100.00%)
System.Windows.Documents.TextTreeUndo::CreateDeleteContentUndoUnit static System.Windows.Documents.TextTreeDeleteContentUndoUnit (System.Windows.Documents.TextContainer System.Windows.Documents.TextPointer System.Windows.Documents.TextPointer): 3.7 kB (100.00%)
System.Windows.Documents.TextTreeDeleteContentUndoUnit::.ctor void (System.Windows.Documents.TextContainer System.Windows.Documents.TextPointer System.Windows.Documents.TextPointer): 3.7 kB (100.00%)
System.Windows.Documents.TextTreeDeleteContentUndoUnit::CopyContent ContentContainer (System.Windows.Documents.TextTreeNode System.Windows.Documents.TextTreeNode): 3.7 kB (100.00%)
System.Windows.Documents.TextTreeDeleteContentUndoUnit::CopyTextNode System.Windows.Documents.TextTreeNode (System.Windows.Documents.TextTreeTextNode System.Windows.Documents.TextTreeNode ContentContainer&): 3.7 kB (100.00%)
System.Char [] : 3.7 kB (100.00%)

生成 UI 更新的代码是:

        List<int> arraystatus = new List<int>(displayarray.ToArray());

StringBuilder s = new StringBuilder();

int i = 1;

foreach (int item in arraystatus)
{
s.Append(i.ToString() + ":\t" + item.ToString() + (i % 8 == 0 ? "\n" : "\t"));
i++;
}

txtStatus.Text = s.ToString();

arraystatus = null;
s = null;

最佳答案

来自 TextBoxBase.UndoLimit 属性的文档:

The number of actions stored in the undo queue. The default is –1, which means the undo queue is limited to the memory that is available.

您找到了那个限制。将其设置为一个相当小的值。

否则,在 TextBox 中显示日志记录信息通常意义不大。它实际上是为了让用户输入文本。也许 TextBlock 是更好的选择。


更新:在 .NET 4.5 中,-1 的默认值更改为 100 以避免这种失控的内存使用。

关于c# - WPF 应用程序中的 TextBox.Text 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3336908/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com