异步EF 6.0需要比同步更长的时间

时间:2014-12-31 17:44:37

标签: c# .net task-parallel-library async-await entity-framework-6

 static void Main(string[] args)
        {

            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();
            Task t = MainAsync();
            t.Wait();

            stopWatch.Stop();
            var sec = stopWatch.ElapsedMilliseconds;


        }


        static async Task MainAsync()
        {
            FutureEntityTestEntities db = new FutureEntityTestEntities();

            var q1 = await db.Table1.ToListAsync();


            var q2 = await db.Table1.ToListAsync();



        }

此查询平均需要2700毫秒。

然而,当我只是在没有异步的情况下进行正常的tolist时需要1800 ms;

  static void Main(string[] args)
        {
            FutureEntityTestEntities db = new FutureEntityTestEntities();

            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();

            var q1 = db.Table1.ToList();

             var q2 = db.Table1.ToList();

            stopWatch.Stop();
            Console.WriteLine(stopWatch.ElapsedMilliseconds);
            Console.ReadLine();
        }

问题是我不明白,它应该采取同步时间除以2 = 900毫秒,但它又增加了900毫秒,这是相当奇怪的。

编辑:现在回答Thx。我修改了代码如下:

static void Main(string[] args)
        {
            Stopwatch stopWatch2;
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();
            Task t = MainAsync();


            stopWatch.Stop();
            Console.WriteLine(stopWatch.ElapsedMilliseconds);
            Console.ReadLine();

        }


        static async Task MainAsync()
        {
            FutureEntityTestEntities db = new FutureEntityTestEntities();

            Task<List<Table1>> q1 = db.Table1.ToListAsync();

            Task<List<Table1>> q2 = db.Table1.ToListAsync();

            await Task.WhenAll(q1, q2);

        }

现在平均需要500毫秒。

我将在互联网上研究为什么并在这里发布答案,如果有人有答案请回复。

2 个答案:

答案 0 :(得分:4)

如果这是您所期望的,那么您不会同时执行这两个.ToListAsync()。如果您希望它们同时执行,则需要执行以下操作:

// Kick off both queries concurrency
Task<List<Table1>> q1 = db.Table1.ToListAsync();
Task<List<Table1>> q2 = db.Table1.ToListAsync();

// Wait for both to finish before returning
await Task.WhenAll(q1, q2);

答案 1 :(得分:4)

  

问题是我不明白,它应该采取同步时间除以2

这是不正确的。这两个查询并不是同时运行的,它们一个接一个地运行顺序。 await表示:异步等待操作完成。

如果要同时执行它们,可以旋转这两个操作,然后使用await Task.WhenAll并传入这两个任务。

作为旁注,使用async-await并非免费提供。有一些编译器可以帮助我们在幕后生成状态机。虽然非常优化,但仍有一些开销。