Example #1
0
        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;
            }
        }
Example #2
0
            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();
                        }
                    }
                }
            }