Dispatcher xps内存泄漏

时间:2014-01-27 15:42:15

标签: memory-leaks dispatcher xps

我使用com interop从vb6 app调用.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对象吗?

1 个答案:

答案 0 :(得分:1)

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

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

总而言之,这似乎没有做任何事情,事实上它实际上确实做到了“没有”。重要的是它等待当前线程的调度程序在执行“无”之前清除了任何优先级高于SystemIdle的计划任务。这允许在您返回到vb6应用程序之前进行计划的清理工作。