1

私はシリアルトランザクションを作成していて、いくつかの問題がありました。
1つのスレッドのみを実行すると、高速で実行され、待機しません。
2つ以上のスレッドを実行すると、完了する最初のスレッドは時間がかかりますが、後続のスレッドは高速です。なぜですか?エンティティフレームワークのシリアルトランザクションの完了に時間がかかります

このプログラムと同時に2つのプロセスを実行すると、各プロセスの最初のスレッドが完了するのに時間がかかりますが、それ以降は高速ですが、これは正常ですか?

私はSQL Express 2008を使用しています

ありがとうございました。

class Program { 

    int numero; 

    Program(int numero) 
    { 
     this.numero = numero; 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Puede presionar una tecla para salir en cualquier momento"); 

     for (int i = 0; i < 10; i++) 
     { 
      Program p = new Program(i + 1); 
      Thread t = new Thread(p.Ejecutar); 
      t.Start(); 
     } 

     Console.ReadKey(); 
    } 

    public void Ejecutar() 
    { 
     bool esPosibleProseguir = true; 
     while (esPosibleProseguir) 
     { 
      Database1Entities cx = new Database1Entities(); 
      TransactionOptions opts = new TransactionOptions(); 
      opts.IsolationLevel = System.Transactions.IsolationLevel.Serializable; 
      System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope(TransactionScopeOption.Required, opts); 

      try 
      { 
       //var mayor = cx.Numeracion.First(); 
       //int nuevo = mayor.Numero + 1; 
       cx.Connection.Open(); 

       int nuevo = cx.VistaNumero.First().Actual; 

       var per = new Persona(); 
       per.Nombre = string.Format("Persona-{0}", nuevo); 
       per.Ci = (1000 + nuevo).ToString(); 
       per.Numero = nuevo; 
       cx.Persona.AddObject(per); 

       //mayor.Numero = nuevo; 

       cx.SaveChanges(); 
       scope.Complete(); 


       Console.WriteLine("Hilo: {0}, Crea persona: {1}", this.numero, nuevo); 
       break; 
      } 
      catch (UpdateException ex1) 
      { 
       esPosibleProseguir = true; 
      } 
      catch (TransactionAbortedException ex2) 
      { 
       esPosibleProseguir = true; 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Hilo: {0}, Excepción: {1}, Mensaje: {2}", this.numero, ex.GetType().Name, ex.Message); 
       esPosibleProseguir = false; 
      } 
      finally 
      { 
       DisponerObjeto(scope); 
       DisponerObjeto(cx); 
      } 
     } 
    } 

    private void DisponerObjeto(IDisposable obj) 
    { 
     try 
     { 
      obj.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Hilo: {0}, Excepción: {1}, Mensaje: {2}", this.numero, ex.GetType().Name, ex.Message); 
     } 
    } 
} 

答えて

0

EF関連のコードの最初の実行は、「モデルのコンパイル」に加えて、非常に時間のかかる操作であり、このコンパイルが完了するまで誰もEFを使用することはできませんいくつかの他の初期化の原因となるので、それをすることができます。それはちょうど推測ですが、percompiled modelを使用して、実行時間が改善するかどうかを検証することができます。

+0

アイソレーションレベルをシリアライズ可能から読み取りコミット済みに変更すると問題がなくなり、 "モデルコンパイル"は原因ではありませんが、シリアルトランザクションが必要で、最初のスレッドが完了するのに時間がかかりすぎます。これは正常ですか?お返事をありがとうございます。 – david

関連する問題