private void GuardarSecuenciaDestino(SecuenciaSinDependencia secuencia, DestinoSecuencia model) { //lock (_syncObj) //{ // AsyncHelper.RunSync(async () => // { long ValorSecuencia = 0; //TransactionScopeOption.RequiresNew using (var scope = new TransactionScope()) { using (var context = new SecuenciaDbContext( )) { //Generar la siguiente secuencia var secuenciaRecuperar = context.Secuencias.AsQueryable() .Where(s => s.Codigo == secuencia.Codigo).SingleOrDefault(); //Aumentar secuencia secuenciaRecuperar.Ultimo = secuenciaRecuperar.Ultimo + secuenciaRecuperar.Incremento; model.Secuencia = secuenciaRecuperar.Ultimo; model.Fecha = DateTime.Now; //Establecer Valor ValorSecuencia = secuenciaRecuperar.Ultimo; model.Secuencia = secuenciaRecuperar.Ultimo; model.SecuenciaUtilizada = secuencia.Codigo; context.DestinoSecuencia.Add(model); //Actualizar secuencia context.Entry(secuenciaRecuperar).State = EntityState.Modified; //await context.SaveChangesAsync(); //Save change to this context context.SaveChanges(); } //Simular un error Random rand = new Random(); if (rand.Next(0, 2) == 0) { throw new Exception(string.Format("Error en la secuencia {0}", ValorSecuencia)); } scope.Complete(); } // }); //} }
public void Debe_Generar_Secuencia_Sin_Saltos() { var fakerSecuencia = new Faker <SecuenciaSinDependencia>() .RuleFor(u => u.Nombre, (f, u) => f.Random.String(20)) .RuleFor(u => u.Codigo, (f, u) => f.Phone.PhoneNumber()) .RuleFor(u => u.Incremento, (f, u) => f.Random.Int(1, 4)) ; var secuencia = fakerSecuencia.Generate(); TestContext.WriteLine(string.Format("Secuencia Inicial {0}", secuencia)); using (var context = new SecuenciaDbContext()) { context.Secuencias.Add(secuencia); context.SaveChanges(); } //Ejecutar tareas en paralelo... Task task1 = Task.Factory.StartNew(() => EjecutarBloque(secuencia, "Bloque1")); Task task2 = Task.Factory.StartNew(() => EjecutarBloque(secuencia, "Bloque2")); Task task3 = Task.Factory.StartNew(() => EjecutarBloque(secuencia, "Bloque3")); Task.WaitAll(task1, task2, task3); TestContext.WriteLine("All threads complete"); List <DestinoSecuencia> destinoList = null; SecuenciaSinDependencia secuenciaFinal = null; //REcuperar secuencia using (var context = new SecuenciaDbContext()) { secuenciaFinal = context.Secuencias.Where(s => s.Codigo == secuencia.Codigo).SingleOrDefault(); destinoList = context.DestinoSecuencia.Where(d => d.SecuenciaUtilizada == secuencia.Codigo).ToList(); } TestContext.WriteLine(string.Format("Secuencia Final {0}", secuenciaFinal)); foreach (var item in destinoList) { TestContext.WriteLine(item.ToString()); } }