WCF поддържа ли извикване на асинхронни операции в TransactionScope?

Изпробвам внедряването на WCF Transaction и стигнах до идеята дали асинхронната транзакция се поддържа от WCF 4.0.

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

В тази ситуация предполагам, че транзакцията ще работи правилно, така ли е?


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


Отговори (2)


Много се съмнявам в това. Изглежда, че ако стартирате ascync операция, вече не участвате в оригиналната транзакция.

Написах малък 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