Как принудительно убить WorkflowInstance? - PullRequest
3 голосов
/ 05 июля 2011

У меня есть несколько необычный сценарий, когда мне нужно иметь возможность прямого забоя "зависших", самостоятельно размещенных WorkflowInstance после заданного порога времени ожидания.Я попробовал методы Abort(), Terminate() и Cancel(), но все они слишком "хороши".Кажется, что все они требуют ответа от WorkflowInstance, прежде чем их соблюдают.

В моем сценарии рабочий процесс вошел в бесконечный цикл и поэтому не отвечает.Вызовы обычных методов, упомянутых выше, будут просто зависать, поскольку рабочий процесс полностью не отвечает.Я был удивлен, узнав, что WorkflowRuntime, похоже, не имеет механизма для работы с этим сценарием, или что Abort() и Terminate() являются просто предложениями, а не насильственными директивами.

Я искал google / msdn/ stackoverflow / etc пытается выяснить, что делать, когда Terminate() просто не справится с работой и не справится.Я подумал о создании собственной базовой активности и присвоении ей значения тайм-аута, чтобы моя «корневая» активность могла убить себя, если одно из ее дочерних действий зависнет.Похоже, что при таком подходе я буду бить кувалдой по мухам ...

Есть ли техника, которую я пропустил?

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Единственное верное решение - считать это ошибкой, исправлять все, что пошло не так, и считать дело закрытым.

Единственный способ принудительно прервать любой код , заблокированный в бесконечном цикле, - это вызвать Abort() в потоке. Конечно, это считается плохим джиу-джеджу, и делать это следует только в том случае, если состояние вызова может быть гарантировано после вызова.

Итак, вы должны предоставить WorkflowApplication реализацию SynchronizationContext , которую вы пишете, которая может вызывать Abort() в потоке, который рабочий процесс Post () с.

0 голосов
/ 05 июля 2011

Я не уверен, что это будет работать, но вы пробовали функцию WorkflowInstance.TryUnload ()? Я помню, что это вызвало несколько событий внутри рабочего процесса (с тех пор, как я это сделал), так что вы можете иметь обработчик событий в своем рабочем процессе, который перехватывает это и выполняет переключатель уничтожения сам по себе.

...