Я пишу пользовательское действие Windows Workflow Foundation, которое запускает некоторый процесс асинхронно, а затем должно проснуться при наступлении асинхронного события.
Все примеры, которые я обнаружил (например, этот Кирк Эванс ), включают настраиваемую службу рабочего процесса, которая выполняет большую часть работы, а затем отправляет событие в очередь, созданную действием. Кажется, что основной причиной этого является то, что единственный метод для публикации события [который работает из потока, не относящегося к WF], это WorkflowInstance.EnqueueItem, и действия не имеют доступа к экземплярам рабочего процесса, поэтому они не могут публиковать события (из потока без WF, где я получаю результат асинхронной операции).
Мне не нравится этот дизайн, поскольку он разбивает функциональность на две части и требует добавления службы на хост при добавлении нового типа активности. Некрасиво.
Итак, я написал следующую общую службу, которую я вызываю из обработчика событий асинхронной операции, и которая может повторно использоваться различными асинхронными действиями (обработка ошибок опущена):
class WorkflowEnqueuerService : WorkflowRuntimeService
{
public void EnqueueItem(Guid workflowInstanceId, IComparable queueId, object item)
{
this.Runtime.GetWorkflow(workflowInstanceId).EnqueueItem(queueId, item, null, null);
}
}
Теперь в коде активности я могу получить и сохранить ссылку на эту службу, запустить мою асинхронную операцию, а когда она завершится, использовать эту службу, чтобы отправить событие в мою очередь. Преимущества этого - я храню весь код, относящийся к конкретной деятельности, внутри действия, и мне не нужно добавлять новые сервисы для каждого типа активности.
Но если посмотреть на официальные примеры и примеры из Интернета, это будут специализированные одноразовые сервисы, я хотел бы проверить, подходит ли этот подход, или я создаю здесь некоторые проблемы?