Перезапустите класс WorkflowServiceHost для версионного рабочего процесса.WF 4 - PullRequest
0 голосов
/ 21 февраля 2011

Мой сценарий следующий: рабочий процесс XAML хранится в базе данных, затем я создаю WorkflowServiceHost из него, и клиент может вызвать его.Пока нет проблем: у меня XAML1 в конечной точке 1.

Позже пользователь меняет xaml.Насколько я знаю из других вопросов, решение состоит в том, чтобы сохранить XAML1, а также сохранить новый XAML2 и запустить новый WorkflowServiceHost.Итак, в конечном итоге получилась конечная точка1 / конечная точка2 для XAML1 / XAML2, и клиент может решить, какой из них вызвать каким-либо образом.

Наконец, мой вопрос: есть ли способ как-то обнаружить, что первый WorkflowServiceHost не имеет ожидающего экземпляра внутри?Я имею в виду, что все рабочие процессы завершены внутри, и вы можете безопасно избавиться от этого хоста службы.

В худшем случае я могу использовать настраиваемого участника отслеживания для входа в систему, если экземпляр запущен, но, возможно, есть другой способ ....

// activity comes from xaml
var jobHost = new WorkflowServiceHost(activity, new Uri("net.pipe://localhost/WorkflowHost"));
jobHost.AddServiceEndpoint("IWorkflowHost", new System.ServiceModel.NetNamedPipeBinding(), "Job1");
// extensions
// behaviors
jobHost.Description.Behaviors.Add(_instanceStore);
jobHost.Open();

Ответы [ 2 ]

2 голосов
/ 21 февраля 2011

Представление [System.Activities.DurableInstancing] .ServiceDeployments будет содержать одну запись для каждой создаваемой конечной точки. Его первичный ключ, ServiceDeploymentId, является внешним ключом в представлении [System.Activities.DurableInstancing] .Instances, которое содержит запись для каждого экземпляра рабочего процесса. Оттуда должен быть простой запрос SQL, чтобы найти конечные точки без связанных экземпляров рабочего процесса.

0 голосов
/ 21 февраля 2011

Если вы просто вызываете рабочий процесс один раз, а затем утилизируете его, вы можете прослушать событие Closed для WorkflowServiceHost.

svchost.Closed += SomeMethod;

private void SomeMethod(object sender, EventArgs e)
{
    // do something after WorkflowServiceHost has closed...
}
...