簡體   English   中英

異步EF 6.0比同步花費的時間更長

[英]Async EF 6.0 taking longer than sync

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

我將在互聯網上研究原因並在此處發布答案,如果有人有答案,請回復。

如果這是您期望的,那么您不會同時執行兩個.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並非免費。 有一個編譯器確實為我們工作,可以在后台生成狀態機。 盡管已非常優化,但仍有一些開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM