等效于使用 c# wpf 的 IsDisposed [重复]
Posted
技术标签:
【中文标题】等效于使用 c# wpf 的 IsDisposed [重复]【英文标题】:Equivalent to IsDisposed using c# wpf [duplicate] 【发布时间】:2016-09-05 16:21:17 【问题描述】:我正在为 tut 视频开发一个自定义键播程序,我正在使用 MouseKeyHook,我正在使用此处找到的示例代码:https://github.com/gmamaladze/globalmousekeyhook/blob/vNext/Demo/Main.cs 让基本构造正常工作。
由于该示例是针对获胜形式的,因此我特别遇到了一行问题。我通过省略 - if (IsDisposed) return;
第 176 行使一切正常。
如何为 wpf 复制此代码?
private void Log(string text)
if (IsDisposed) return;
textBoxLog.AppendText(text);
textBoxLog.ScrollToLine(textBoxLog.LineCount - 1);
编辑:这与垃圾回收无关,因为如果表单被处理,textBoxLog 将抛出 ObjectDisposedException。
【问题讨论】:
在 MSDN 和 Stack Overflow(包括标记的副本)上进行了广泛的讨论,解释了IDisposable
,它的用途,如何使用它等等,当然理解所有这些将确保你还要了解IsDisposed
属性的含义以及您为什么会或不会使用它。
@PeterDuniho 我的问题是如何在 wpf 中复制它。与其说是什么。但谢谢。如果我曾经使用赢表格,就知道该去哪里。
您的问题是关于IDisposable
,而IDisposable
与WPF 或Winforms 无关。您有问题的对象恰好是 Winforms 对象是无关紧要的。任何实现IDisposable
的对象也可以实现IsDisposed
属性,并且具有相同的含义。一旦您知道IDisposable
的用途(以及它的用途),您就可以轻松地了解如何使用该属性以及是否需要在代码中使用它。
顺便说一句,根据您在此处发布的问题,我怀疑您已尝试通过简单地将 Winforms 代码音译为您认为在WPF。但是这样做,您将得到的不是 WPF 程序,而是一个使用 WPF API 的 Winforms 程序。从长远来看,通过花时间学习 WPF,然后花时间了解您尝试转换的程序实际上 做了什么,您将获得更好的结果,并使用重新实现它正确的 WPF 习惯用法。
btw @PeterDuniho 答案不在您标记的副本上,请您取消标记。 ty
【参考方案1】:
这不是用于垃圾收集,这是因为如果在处理表单后尝试调用 AppendText
或 ScrollToLine
并且在事实。
WPF 窗口和控件不像 winforms 那样是一次性的,但是如果您想重新创建该行为,只需覆盖 OnClosed
方法并设置一个标志。
private bool _isClosed = false;
protected override void OnClosed(EventArgs e)
_isClosed = true;
base.OnClosed(e);
private void Log(string text)
if (_isClosed) return;
textBoxLog.AppendText(text);
textBoxLog.ScrollToLine(textBoxLog.LineCount - 1);
【讨论】:
那么 67mb 内存使用还可以吗? 是的,WPF 比 winforms 更“重”。 76mb 对于 GUI 应用程序来说是完全正常的。您应该担心的是,如果您看到这个数字不断增长并且从未稳定到一个稳定的数字。 @drume 如果您真的关心程序中的内存使用情况,请使用 Visual Studio 内置的 Memory Profiler 或使用像 DotMemory 这样提供 5 天的第 3 方试用。以上是关于等效于使用 c# wpf 的 IsDisposed [重复]的主要内容,如果未能解决你的问题,请参考以下文章
WPF等效于Application.AddMessageFilter(Windows窗体)
WinForms 等效于 WPF WindowInteropHelper、HwndSource、HwndSourceHook