4

私はWCFトランザクションの実装を試していますが、非同期トランザクションがWCF4.0でサポートされているかどうかを考え出しました。

たとえば、client \ serviceトランザクションを有効にしたいくつかのサービス操作があります。クライアント側ではTransactionScopeを使用し、トランザクション内でそれらの操作を非同期的に呼び出すタスクを作成します。

この状況では、トランザクションは正しく機能すると思いますよね?

4

2 に答える 2

0

作成した Task に 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
    }
}

ご想像のとおり、これは繰り返しになるので、ヘルパーを作成することをお勧めします。

于 2015-09-09T09:39:13.887 に答える
0

私はそれを非常に疑っています。非同期操作を開始している場合、元のトランザクションに参加していないようです。

少し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
    }
}
于 2012-06-05T08:32:18.573 に答える