[英]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.