Поддерживает ли WCF вызов асинхронных операций в TransactionScope?

Я пробую реализацию транзакции WCF, и мне приходит в голову идея, поддерживается ли асинхронная транзакция WCF 4.0.

например, у меня есть несколько сервисных операций с включенной транзакцией клиент\сервис, на стороне клиента я использую TransactionScope и внутри транзакции создаю задачи для асинхронного вызова этих операций.

В этой ситуации я предполагаю, что транзакция будет работать правильно, верно?


person Learner    schedule 05.06.2012    source источник


Ответы (2)


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

Я написал небольшой тест LINQPad

void Main()
{
    using (var scope = new TransactionScope(TransactionScopeOption.Required))
    {
    try
    {
        Transaction.Current.Dump("created");
        Task.Factory.StartNew(Test);
        scope.Complete();
    }
    catch (Exception e)
    {
    Console.WriteLine(e);
    }
    Thread.Sleep(1000);
}

Console.WriteLine("closed");
Thread.Sleep(5000);
}


public void Test()
{
using (var scope = new TransactionScope(TransactionScopeOption.Required))
    {
    Transaction.Current.Dump("test start"); // null
    Thread.Sleep(5000);
    Console.WriteLine("done");
    Transaction.Current.Dump("test end"); // null
    }
}
person flayn    schedule 05.06.2012
comment
Проверьте мой ответ для решения. - person Ajden Towfeek; 09.09.2015

Вам нужно будет установить как OperationContext, так и Transaction.Current в созданной задаче.

В частности, в сервисе вам нужно будет сделать следующее:

public Task ServiceMethod() {
    OperationContext context = OperationContext.Current;
    Transaction transaction = Transaction.Current;

    return Task.Factory.StartNew(() => {
         OperationContext.Current = context;
         Transaction.Current = transaction;

         // your code, doing awesome stuff
    }
}

Это становится повторяющимся, как вы могли подозревать, поэтому я бы рекомендовал написать для него помощник.

person Ajden Towfeek    schedule 09.09.2015