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毫秒。
我将在互联网上研究为什么并在这里发布答案,如果有人有答案请回复。
答案 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
并非免费提供。有一些编译器可以帮助我们在幕后生成状态机。虽然非常优化,但仍有一些开销。