Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 5th, 2012  |  syntax: None  |  size: 2.51 KB  |  hits: 14  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Entity framework serial transaction takes too much time to complete
  2. class Program {
  3.  
  4.     int numero;
  5.  
  6.     Program(int numero)
  7.     {
  8.         this.numero = numero;
  9.     }
  10.  
  11.     static void Main(string[] args)
  12.     {
  13.         Console.WriteLine("Puede presionar una tecla para salir en cualquier momento");
  14.  
  15.         for (int i = 0; i < 10; i++)
  16.         {
  17.             Program p = new Program(i + 1);
  18.             Thread t = new Thread(p.Ejecutar);
  19.             t.Start();
  20.         }
  21.  
  22.         Console.ReadKey();
  23.     }
  24.  
  25.     public void Ejecutar()
  26.     {  
  27.         bool esPosibleProseguir = true;
  28.         while (esPosibleProseguir)
  29.         {
  30.             Database1Entities cx = new Database1Entities();
  31.             TransactionOptions opts = new TransactionOptions();
  32.             opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
  33.             System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opts);
  34.  
  35.             try
  36.             {
  37.                 //var mayor = cx.Numeracion.First();
  38.                 //int nuevo = mayor.Numero + 1;
  39.                 cx.Connection.Open();
  40.  
  41.                 int nuevo = cx.VistaNumero.First().Actual;
  42.  
  43.                 var per = new Persona();
  44.                 per.Nombre = string.Format("Persona-{0}", nuevo);
  45.                 per.Ci = (1000 + nuevo).ToString();
  46.                 per.Numero = nuevo;
  47.                 cx.Persona.AddObject(per);
  48.  
  49.                 //mayor.Numero = nuevo;
  50.  
  51.                 cx.SaveChanges();
  52.                 scope.Complete();
  53.  
  54.  
  55.                 Console.WriteLine("Hilo: {0}, Crea persona: {1}", this.numero, nuevo);
  56.                 break;
  57.             }
  58.             catch (UpdateException ex1)
  59.             {
  60.                 esPosibleProseguir = true;
  61.             }
  62.             catch (TransactionAbortedException ex2)
  63.             {
  64.                 esPosibleProseguir = true;
  65.             }
  66.             catch (Exception ex)
  67.             {
  68.                 Console.WriteLine("Hilo: {0}, Excepción: {1}, Mensaje: {2}", this.numero, ex.GetType().Name, ex.Message);
  69.                 esPosibleProseguir = false;
  70.             }
  71.             finally
  72.             {
  73.                 DisponerObjeto(scope);
  74.                 DisponerObjeto(cx);
  75.             }
  76.         }
  77.     }
  78.  
  79.     private void DisponerObjeto(IDisposable obj)
  80.     {
  81.         try
  82.         {
  83.             obj.Dispose();
  84.         }
  85.         catch (Exception ex)
  86.         {
  87.             Console.WriteLine("Hilo: {0}, Excepción: {1}, Mensaje: {2}", this.numero, ex.GetType().Name, ex.Message);
  88.         }
  89.     }
  90. }