Example #1
0
        /// <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);
            }
        }
Example #2
0
            /// <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);
                }
            }
Example #3
0
 /// <summary>
 /// Добавляет обработчик до завершения транзакции
 /// </summary>
 public static void AddBeforeCompletionHandler(ITxCompletionHandler handler)
 {
     AddCompletionHandler(handler, false);
 }
Example #4
0
 /// <summary>
 /// Добавляет обработчик после завершения транзакции
 /// </summary>
 public static void AddCompletionHandler(ITxCompletionHandler handler)
 {
     AddCompletionHandler(handler, true);
 }