/// <summary> /// Добавляет обработчик завершения транзакции /// </summary> private static void AddCompletionHandler(ITxCompletionHandler handler, bool isAfterTxCompleted) { if (!IsInTx) { // Если в момент задания обработчика транзакции нет, обработчик выполняется сразу же handler.TxCompleted(new TxCompletedEventArgs(null, isAfterTxCompleted)); } else { // Если в момент задания обработчика есть транзакция, обработчик ожидает завершения транзакции string txId = Transaction.Current.TransactionInformation.LocalIdentifier; // Логика исключает возникновение дедлока, который способен привести к катастрофическим последствиям TxCompletionHandlerList handlerList = null; Dictionary <string, TxCompletionHandlerList> handlerCollection = (isAfterTxCompleted ? _afterCompletionHandlers : _beforeCompletionHandlers); lock (handlerCollection) { if (!handlerCollection.TryGetValue(txId, out handlerList)) { handlerList = new TxCompletionHandlerList(); handlerCollection.Add(txId, handlerList); } } handlerList.AddHandler(handler); } }
/// <summary> /// Добавляет обработчик /// </summary> public void AddHandler(ITxCompletionHandler handler) { lock (this._handlers) { IExtensibleTxCompletionHandler extensibleHandler = handler as IExtensibleTxCompletionHandler; if (extensibleHandler != null) { foreach (ITxCompletionHandler addedHandler in this._handlers) { // Расширяемые обработчики завершения транзакции не добавляются в список обработчиков, // если в списке есть обработчик, действие которого они могут расширить IExtensibleTxCompletionHandler addedExtensibleHandler = addedHandler as IExtensibleTxCompletionHandler; if (addedExtensibleHandler != null && addedExtensibleHandler.Extend(extensibleHandler)) { return; } } } this._handlers.AddLast(handler); } }
/// <summary> /// Добавляет обработчик до завершения транзакции /// </summary> public static void AddBeforeCompletionHandler(ITxCompletionHandler handler) { AddCompletionHandler(handler, false); }
/// <summary> /// Добавляет обработчик после завершения транзакции /// </summary> public static void AddCompletionHandler(ITxCompletionHandler handler) { AddCompletionHandler(handler, true); }