2014-09-03 44 views
1

我正盯着一个TransactionScope并订阅Transaction.Current.TransactionCompleted。为了防止并行事务的问题,我使用Monitor。我能确定在任何情况下都会调用Transaction.Current.TransactionCompleted吗?.net是否保证调用Transaction.Current.TransactionCompleted?

Monitor.Enter(TransactionScopeLockString); 

TransactionOptions transactionOptions = new TransactionOptions(); 

TransactionScope result = new TransactionScope(scopeOption, transactionOptions); 

Transaction.Current.TransactionCompleted += (sender, transactionEventArgs) => 
{ 
    if (transactionEventArgs.Transaction.TransactionInformation.Status 
       == TransactionStatus.Aborted) 
    { 
     // clear stuff 
    } 

    Monitor.Exit(TransactionScopeLockString); 
}; 

回答

1

尽管您的代码可能存在一个问题,但有保证。我记得TransactionCompleted事件在另一个线程上被调用,所以Monitor.Exit将不起作用。您不能在一个线程上输入显示器,并在另一个线程上退出。我相信你可以用ManualResetEvent代替:Monitor.Enter and Monitor.Exit in different threads

相关问题