2014-01-27 2 views
0

Я звоню в .net 4.0 dll из приложения vb6, используя com interop. В .net Я создаю документ xps через фиксированный документ xaml и сохраняю его на диске. Это вызывает утечку памяти и я нашел здесь отличное решение.Dispatcher 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

Хотя изначально кажется, что прилагаемый код ничего не делает, на самом деле он имеет неочевидный побочный эффект, который решает вашу проблему. Перейдем к этапу:

  • Dispatcher.CurrentDispatcher Получает диспетчер для текущей темы.
  • Invoke синхронно выполняет прилагаемый делегат на потоке диспетчера (текущий)
  • DispatcherPriority.SystemIdle устанавливает приоритет Execution
  • new DispatcherOperationCallback(delegate { return null; }) создает делегат, который ничего не делает
  • null передаются в качестве аргумента делегата

Все это похоже на то, что оно ничего не делает, и на самом деле оно действительно ничего не делает. Важная часть заключается в том, что он ждет, пока диспетчер текущего потока не очистит любые запланированные задачи, которые имеют более высокий приоритет, чем SystemIdle, прежде чем делать «ничего». Это позволяет выполнить запланированную работу по очистке до того, как вы вернетесь в свое приложение vb6.

+0

спасибо. Приятно знать, что очистка проходит! –

Смежные вопросы