我正在查看TransactionScope并订阅Transaction.Current.TransactionCompleted
。为了防止并行事务的问题,我使用Monitor。我可以确定在任何情况下都会调用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);
};
答案 0 :(得分:1)
尽管您的代码可能存在一个问题,但仍然可以保证。我记得在另一个线程上调用了TransactionCompleted
事件,因此Monitor.Exit
将无效。您无法在一个线程上进入监视器并将其退出另一个线程。
我相信您可以使用ManualResetEvent
代替Monitor.Enter and Monitor.Exit in different threads