Эта особая проблема сводит меня с ума. Интересно, испытывал ли кто-нибудь подобную проблему. Если я загружаю рабочий процесс, выгружаю его и выполняю снимок памяти, тогда результат предсказуем - мой рабочий процесс больше не находится в памяти. Однако, если я загружаю рабочий процесс и устанавливаю действие PersistableIdle в PersistableIdleAction.Unload, и пусть рабочий процесс не работает, рабочий процесс остается в памяти, даже если срабатывает действие Unload.Утечка памяти при использовании Workflow 4.0 SqlWorkflowInstanceStore и PersistableIdleAction.Unload
Я использовал ANTI Memory Profiler для отладки этой проблемы. Это выводимый граф объекта, показывающий, что внутренний объект висит на моем экземпляре рабочего процесса.
alt text http://www.rohland.co.za/wp-content/uploads/2010/04/Workflow_retention_graph.png
Может ли кто-то проверить эту проблему? Мой код сводится к следующему:
- Создать SqlWorkflowInstanceStore и владелец замка установки ручка
- На данный момент я беру снимок памяти - Создание экземпляра Workflow1
- Установить действие PersistableIdle
- Примените instancestore к Workflow1
- Настройка обработчиков событий события для Idle, Unload, UnhandledException и т. Д.
- Сохранять рабочий процесс instanc е
- Запустите экземпляр рабочего процесса
- Дождитесь экземпляра на холостом ходу (из-за активности задержки)
- Убедитесь, что действие Разгрузка обжигают
- На данный момент я беру второй снимок памяти
Из приведенного выше изображения видно, что единственным объектом, ссылающимся на Workflow1, является некоторый результат обработки внутренних обработчиков событий, который у меня нет в распоряжении.
Любые подсказки?
Если вы хотите воспроизвести это поведение, откройте следующий образец, предоставленный библиотекой образцов WCF и WF из Microsoft - WF \ Basic \ Execution \ ControllingWorkflowApplications \ CS. Если я открою приложение и запустил несколько экземпляров рабочих процессов, они завершатся, но память не будет выпущена. – Rohland