异步 EF 6.0 比同步花费的时间更长

本文关键字:时间 同步 EF 异步 | 更新日期: 2023-09-27 18:35:59

 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 毫秒。

但是,当我只是在没有异步的情况下正常列出时,它需要 1800 毫秒;

  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 = 900ms,但它又增加了 900 毫秒,这很奇怪。

编辑:现在感谢答案。我修改了代码如下:

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 毫秒。

我将在互联网上研究原因并在此处发布答案,如果有人有答案,请回复。

异步 EF 6.0 比同步花费的时间更长

如果这是

您所期望的,您不会同时执行两个.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);

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

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

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

作为旁注,使用 async-await 不是免费的。有一个编译器,它确实为我们在幕后生成状态机工作。虽然非常优化,但仍然有一些开销。