Лучший метод, который я нашел для наиболее эффективного / правильного захвата, заключается в следующем:
Внутри транзакции используя оператор и перед вызовом scope / Complete ().
//Register for the transaction completed event for the current transaction
Transaction.Current.TransactionCompleted += new TransactionCompletedEventHandler(Current_TransactionCompleted);
Затем создайте функцию обработчика событий следующим образом:
/// <summary>
/// Handles the TransactionCompleted event of the Current control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Transactions.TransactionEventArgs"/> instance containing the event data.</param>
static void Current_TransactionCompleted(object sender, TransactionEventArgs e)
{
if (e.Transaction.TransactionInformation.Status == TransactionStatus.Committed)
{
/// Yay it's committed code goes here!
}
}
Цитировать MSDN
"Вы можете зарегистрироваться для этого события вместо использования изменяемого перечисления для получения информации о результате для транзакций. Параметр, передаваемый делегату TransactionCompletedEventHandler, является экземпляром Transaction. Затем можно запросить свойство TransactionInformation определенного экземпляра, чтобы получить экземпляр объекта TransactionInformation, свойство Status которого содержит состояние транзакции со значением Committed или Aborted. "