Синхронное отслеживание рабочего процесса - PullRequest
1 голос
/ 11 января 2010

Я работаю с SqlTrackingService в Workflow Foundation, и я хотел бы убедиться, что мои данные отслеживания сохраняются, прежде чем я продолжу выполнять какой-либо код. Из того, что я прочитал, служба отслеживания должна выполнить одно из следующих действий:

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

OR

  • Если служба отслеживания не является транзакционной, данные отслеживания сохраняются немедленно.

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

В своей деятельности я подключился к очереди. Когда элемент очереди доступен, я выполняю следующее (только для тестирования):

private void TestTracking()
{
    TrackData("Key", new TrackingDataContainer("Value", Name, DateTime.Now));

    var sqlTrackingQuery = new SqlTrackingQuery(ConnectionString);

    SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance;
    sqlTrackingQuery.TryGetWorkflow(WorkflowInstanceId, out 
        sqlTrackingWorkflowInstance);

    var events = sqlTrackingWorkflowInstance.UserEvents
        .Where(p => typeof (TrackingDataContainer)
            .IsAssignableFrom(p.UserData.GetType()))
        .Where(p => p.UserDataKey == "Key")
        .ToList();

    MessageBox.Show(events.Count().ToString());
}

Я ожидаю, что в первый раз, когда я сделаю доступным элемент очереди, я вижу сообщение 1. Вместо этого оно равно 0. Если я публикую другой элемент очереди, я ожидаю 2, но вижу 1. Я предполагаю, что если если бы добавляли элементы очереди быстрее, я мог бы видеть 0 в обоих случаях.

Мне это кажется асинхронным. Я также попытался вставить вызовы Thread.sleep, которые, кажется, работают, но это неприятный способ сделать что-то. Есть предложения?

...