等效于使用 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】:

这不是用于垃圾收集,这是因为如果在处理表单后尝试调用 AppendTextScrollToLine 并且在事实。

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

C# 等效于 Apache HttpAsyncClient

等效于 Avalonia 的应用程序设置

C# 等效于 Java 的 Arrays.fill() 方法[重复]

C++ typedef struct 等效于 C#