Я работаю с 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, которые, кажется, работают, но это неприятный способ сделать что-то. Есть предложения?