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