C#/ EF6:如何在没有EF错误的情况下执行多线程负载测试

时间:2016-01-27 05:26:36

标签: c# multithreading entity-framework

设置

我在EF6上开发了一个MVC Web应用程序。为了执行一些维护任务,我有一个单独的控制台应用程序,可以访问相同的代码库,在那里我可以编写脚本,并且通常在我和直接数据操作之间设置安全级别。

我想做什么

Web应用程序中的某些错误仅在许多用户的负载下显示(峰值将是大约300个并发用户)。我想运行一个多线程测试,所有线程执行数据和计算密集型任务,以模拟更接近满载的东西。

我的代码

这是我运行测试的代码:

public static void LoadTest(int durationInSeconds, int maxThreads)
{            
    //Create a collection of threads with its associated request data. Each MiscRequest has
    //its own context and contains all the test methods.
    var threads = new List<Tuple<Thread, MiscRequest>>();
    Report.ReportLine("Beginning load testing...");            

    //while the test is stil running...
    var endTime = DateTime.Now.AddSeconds(durationInSeconds);
    while (DateTime.Now <= endTime)
    {
        Console.Write(string.Format("\rThread Count: {0} - Time Remaining: {1}", threads.Count().ToString(), (endTime - DateTime.Now).ToString()));
        //clean out any old threads
        threads.RemoveAll(t => !t.Item1.IsAlive);

        //start a new thread if there is room
        while (threads.Count() < maxThreads)
        {
            //create the request using the default connection string for the new context                    
            MiscRequest request = new MiscRequest(DEFAULT_CONNECTION, true);

            //attach that method to a thread and kick it off
            var t = new Thread(GetTestMethod(request));
            t.Start();

            //store the thread and the context
            threads.Add(new Tuple<Thread, MiscRequest>(t, request));
        }

        //pause a bit for the threads to work
        Thread.Sleep(LOOP_WAIT_TIME_MS);
    }

    //finish up all the work
    threads.ForEach(t => t.Item1.Join());
}

当我运行此方法(使用&gt; 1个线程)时,EF会生成错误: System.InvalidOperationException&#39;发生在EntityFramework.dll中附加信息:创建模型时无法使用上下文。如果在OnModelCreating方法中使用上下文,或者同时由多个线程访问相同的上下文实例,则可能抛出此异常。请注意,DbContext和相关类的实例成员不保证是线程安全的。

我想我可能会在移动到下一个线程之前尝试检查dbcontext是否已初始化,因为我读到同时初始化多个上下文可能会产生此错误,但我找不到任何方法来确定上下文是否已经初始化。

我的问题

我的Web应用程序设法完成我想要做的事情,允许每个用户调用这些方法而不会导致问题。我如何复制该功能,或以某种方式允许多个数据写入不会导致EF投入适合?

0 个答案:

没有答案