Определение, когда завершенный экземпляр рабочего процесса был сохранен - PullRequest
0 голосов
/ 10 февраля 2012

В настоящее время я использую WorkFlowServiceHost в сочетании с готовым SqlWorkflowInstanceStore для постоянных целей.Мне нужно знать, когда завершенный экземпляр рабочего процесса действительно был сохранен в базе данных, т.е. мне требуется уведомление сразу после того, как соответствующая строка в [System.Activities.DurableInstancing] .InstancesTable была обновлена ​​с iscompleted = 1

Iунаследовал от класса trackingparticipant и переопределил метод TRACK.

Затем я делаю следующее, чтобы добавить профиль.

    Dim instanceQuery As New WorkflowInstanceQuery
    instanceQuery.States.Add(WorkflowInstanceStates.Completed)

    Dim runCompletedTrackingProfile As New TrackingProfile
    runCompletedTrackingProfile.Name = "runCompletedTrackingProfile"
    runCompletedTrackingProfile.Queries.Add(instanceQuery)

    Dim trackingParticipant As New RunCompletedTrackingParticipant With {.TrackingProfile = runCompletedTrackingProfile}

    _CommPayRunWorkFlowServiceHost.WorkflowExtensions.Add(trackingParticipant)

Это все работает нормально, и если я ставлю точку остановав моем классе TrackingParticipant это будет достигнуто в ожидаемое время.ОДНАКО, на данный момент, хотя экземпляр рабочего процесса в памяти ЗАВЕРШЕН, база данных еще не была обновлена.Я предполагаю, что это потому, что постоянный код выполняется в том же потоке, потому что, если я запускаю другой поток в моем отслеживающем участнике, я вижу, что поле 'iscompleted' ОБНОВЛЯЕТСЯ обновленным.

Что является самым элегантнымспособ достижения этого без постоянного опроса базы данных?Я посмотрел на метод .WaitForEvents в хранилище экземпляров, но, похоже, он не делает то, что мне нужно

1 Ответ

1 голос
/ 14 февраля 2012

Поскольку ввод-вывод выполняется асинхронно, любой дизайн, который требует от вас этого, может привести к хрупкому коду.Почему вы хотите это сделать?

...