none
Transação com multithread RRS feed

  • Pergunta

  • Bom pessoal estou fazendo um sistema que utiliza multithread. Só que a transação não funciona, gostaria da ajuda de vocês. Segue abaixo o código:

    int interacoes = 64;
    ManualResetEvent[] completedEvento =
    new ManualResetEvent[interacoes];
    
    Work[] works = new Work[interacoes];
    int count = 0;
    
    for (int i = 0; i < tiposConsolidacao.Count; i++)
    {
       using (TransactionScope scope = new TransactionScope())      { 
          if (tiposConsolidacao[i].Calculo != null)
          {
               completedEvento[count] = new ManualResetEvent(false);
                                Work work = new Work(tiposConsolidacao[i], balancoDiario, bpCalculoFormula, completedEvento[count], null);//Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete));
                                works[count] = work;
           ThreadPool.QueueUserWorkItem(work.MetodoCallback, count);
    
                                if (count != 0 && count == (interacoes - 1))
                                {
                                    WaitHandle.WaitAll(completedEvento);
                                    
                                    count = 0;
                                }
                                else
                                    count++;
    
                                scope.Complete();
                            }
    
                        }
    
    --classe work
    
     public class Work 
        {
            public DependentTransaction transaction
            {
                get;
                set;
            }
    
            #region Gets / Sets
    
            private ManualResetEvent _completouEvent;
    
            public TipoConsolidacao TipoConsolidacao
            {
                get;
                set;
            }
    
            public BalancoDiario BalancoDiario
            {
                get;
                set;
            }
    
            public BpCalculoFormula BpCalculoFormula
            {
                get;
                set;
            }
    
    
            #endregion
    
            public Work(TipoConsolidacao tipoconsolidacao, BalancoDiario balancoDiario, BpCalculoFormula bpCalculoFormula, ManualResetEvent completouTrabalho, DependentTransaction transacao)
            {
                this.TipoConsolidacao = tipoconsolidacao;
                this.BalancoDiario = balancoDiario;
                this.BpCalculoFormula = bpCalculoFormula;
                this.transaction = transacao;
                _completouEvent = completouTrabalho;
            }
    
    
    
            public void MetodoCallback(Object contextoThread)
            {
                DependentTransaction dTx = (DependentTransaction)this.transaction;
                
    
                using (TransactionScope ts = new TransactionScope(dTx))
                try
                {
                    
                    int a = 0;
                    while (a < 10)
                    {
                        try
                        {
                            decimal valor = BpCalculoFormula.GetCalculo(TipoConsolidacao.Calculo.Tag, BalancoDiario.DtBalancoDiario.Value);
                            new BpConsolidacao().Consolidar(BalancoDiario, TipoConsolidacao, valor);
                            ts.Complete();
                            _completouEvent.Set();
                            
                            break;
    
                        }
                        catch (Exception ex)
                        {
                            a++;
                        }
                    }
    
                    
                }
                catch (Exception ex)
                {
                   
                    throw;
                }
                dTx.Complete();
                
            }
    }



    Fernando

    quinta-feira, 27 de dezembro de 2012 14:54

Todas as Respostas