异步 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 毫秒。
我将在互联网上研究原因并在此处发布答案,如果有人有答案,请回复。
如果这是
您所期望的,您不会同时执行两个.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
不是免费的。有一个编译器,它确实为我们在幕后生成状态机工作。虽然非常优化,但仍然有一些开销。