private static void TransactionCompletedImpl(TxCompletedEventArgs e, Dictionary <string, TxCompletionHandlerList> handlersCollection) { try { string txId = e.Tx.TransactionInformation.LocalIdentifier; TxCompletionHandlerList handlerList; lock (handlersCollection) { handlersCollection.TryGetValue(txId, out handlerList); } if (handlerList != null) { handlerList.TransactionCompleted(e); lock (handlersCollection) { handlersCollection.Remove(txId); } } } catch (Exception ex) { Trace.WriteLine(ex.ToString()); throw; } }
public void TransactionCompleted(TxCompletedEventArgs e) { // Реализация цикла должна быть именно такой. // Причина: набор обработчиков может расширяться по мере выполнения этого цикла while (true) { ITxCompletionHandler handler; lock (this._handlers) { if (this._handlers.Count == 0) { break; } handler = this._handlers.First.Value; } bool cycleIsTerminated = false; try { handler.TxCompleted(e); } catch (Exception ex) { Trace.WriteLine(ex.ToString()); // Если ошибка возникает в обрабочике внутри транзакции, исключение должно быть вброшено if (!e.IsAfterTxCompleted) { cycleIsTerminated = true; throw; } } finally { if (!cycleIsTerminated) { this._handlers.RemoveFirst(); } } } }