Серийная транзакция Entity Framework занимает слишком много времени для завершения - PullRequest
1 голос
/ 25 января 2012

Я пишу последовательную транзакцию и у меня возникли проблемы.
Если я выполняю только один поток, он выполняется быстро, без ожидания.
Если я выполняю два или более потоков, первый завершенный поток занимает слишком много времени, но последующие потоки быстры, почему?

Если я запускаю два процесса одновременно из этой программы, первый поток каждого процесса занимает слишком много времени для завершения, но последующие выполняются быстро, это нормально?

Я использую 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);
        }
    }
}

1 Ответ

0 голосов
/ 25 января 2012

Это может быть потому, что первое выполнение кода, связанного с EF, вызывает «компиляцию модели» плюс некоторые другие инициализации, что является довольно трудоемкой операцией, и до тех пор, пока эта компиляция не будет завершена, никто больше не сможет использовать EF. Это всего лишь предположение, но вы можете попытаться использовать скомпилированную модель для проверки, улучшится ли время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...