【问题标题】:Dispatcher xps memory leakDispatcher xps 内存泄漏
【发布时间】:2023-03-14 16:15:01
【问题描述】:

我正在使用 com 互操作从 vb6 应用程序调用 .net 4.0 dll。在 .net 中,我通过 xaml 固定文档创建了一个 xps 文档并将其保存到磁盘。这会导致内存泄漏,我在这里找到了一个很好的解决方案。

Saving a FixedDocument to an XPS file causes memory leak

上面对我有用的解决方案涉及这行代码:

    Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.SystemIdle, new DispatcherOperationCallback(delegate { return null; }), null);

这行代码到底发生了什么。是通过将委托设置为 null 来处理 Dispatcher 对象吗?

【问题讨论】:

    标签: memory-leaks dispatcher xps


    【解决方案1】:

    虽然提供的代码最初看起来什么都不做,但它实际上有一个不明显的副作用,可以解决您的问题。让我们把它分解成几个步骤:

    • Dispatcher.CurrentDispatcher 获取当前线程的调度程序。
    • Invoke 在调度程序的线程(当前线程)上同步执行提供的委托
    • DispatcherPriority.SystemIdle 设置执行优先级
    • new DispatcherOperationCallback(delegate { return null; }) 创建一个什么都不做的委托
    • null 作为参数传递给委托

    总而言之,这看起来什么都不做,实际上它确实“什么都不做”。重要的部分是它等待当前线程的调度程序清除所有优先级高于SystemIdle 的计划任务,然后再执行“无”操作。这允许在您返回 vb6 应用程序之前进行预定的清理工作。

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 2013-01-08
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 2013-01-20
      相关资源
      最近更新 更多