Memory leaks 调度程序xps内存泄漏

Memory leaks 调度程序xps内存泄漏,memory-leaks,dispatcher,xps,Memory Leaks,Dispatcher,Xps,我正在使用com互操作从vb6应用程序调用.net 4.0 dll。在.net中,我通过xaml固定文档创建了一个xps文档,并将其保存到磁盘。这会导致内存泄漏,我在这里找到了一个很好的解决方案 上述对我有效的解决方案涉及以下代码行: Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.SystemIdle, new DispatcherOperationCallback(delegate { return null; }),

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

上述对我有效的解决方案涉及以下代码行:

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

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

虽然最初看起来提供的代码没有任何作用,但实际上有一个不明显的副作用,可以解决您的问题。让我们将其分解为以下步骤:

  • Dispatcher.CurrentDispatcher
    获取当前线程的调度程序
  • Invoke
    在调度程序的线程(当前线程)上同步执行提供的委托
  • DispatcherPriority.SystemIdle
    设置执行优先级
  • 新建DispatcherOperationCallback(委托{return null;})
    创建一个不执行任何操作的委托
  • null
    作为参数传递给委托
总的来说,这看起来好像什么都不做,事实上它实际上什么都不做。重要的一点是,在执行“nothing”之前,它会等待当前线程的调度程序清除任何优先级高于
SystemIdle
的计划任务。这允许在返回vb6应用程序之前执行计划的清理工作