有人可以解释一下这两个块之间的区别吗?
这个执行大约 2 秒(这意味着等待是异步的。
[Test]
public async void TestAwait()
{
var sw = new Stopwatch();
sw.Start();
var task = TestAwaiter(5, 2000).ConfigureAwait(false);
var task1 = TestAwaiter(10, 2000).ConfigureAwait(false);
var i = await task;
var j = await task1;
Console.WriteLine(i+j);
Console.WriteLine(Math.Round(sw.Elapsed.TotalSeconds, 0));
Assert.AreEqual(Math.Round(sw.Elapsed.TotalSeconds, 0), 2);
sw.Stop();
}
public async Task<int> TestAwaiter(int num, int waitTimeSec)
{
await Task.Delay(waitTimeSec).ConfigureAwait(false);
return num;
}
这个执行大约 4 秒(这意味着等待是同步的。
[Test]
public async void TestAwait()
{
var sw = new Stopwatch();
sw.Start();
var i = await TestAwaiter(5, 2000).ConfigureAwait(false);
var j = await TestAwaiter(10, 2000).ConfigureAwait(false);
Console.WriteLine(i+j);
Console.WriteLine(Math.Round(sw.Elapsed.TotalSeconds, 0));
Assert.AreEqual(Math.Round(sw.Elapsed.TotalSeconds, 0), 2);
sw.Stop();
}
public async Task<int> TestAwaiter(int num, int waitTimeSec)
{
await Task.Delay(waitTimeSec).ConfigureAwait(false);
return num;
}
我不明白它们有什么不同。为什么稍后分配等待任务然后创建它会影响执行顺序。
第一个任务在await
之前启动两个任务,第二个任务"等待"到第一个任务完成,然后启动第二个任务。
第一个代码示例:
// starting 2 tasks at 0 seconds
var task = TestAwaiter(5, 2000).ConfigureAwait(false);
var task1 = TestAwaiter(10, 2000).ConfigureAwait(false);
// waiting for task to finish (about 2 second)
var i = await task;
// waiting for task1 to finish (likely 0 seconds as already waited 2 from 0)
var j = await task1;
第二:
// waiting for task to finish (about from 0 to 2 second)
var i = TestAwaiter(5, 2000).ConfigureAwait(false);
// waiting for task to finish (about from 2 to 4 second)
var j = TestAwaiter(5, 2000).ConfigureAwait(false);
async
方法同步运行,直到到达第一个await
。然后,它在逻辑上接受等待的任务,将方法的其余部分添加为延续,并返回表示整个操作的任务。
await
每个任务时,您将异步等待延迟完成,然后再开始第二个任务。当您不这样做时,延迟会同时发生(因此它们花费的时间是一个接一个运行的时间的一半)。
您可以使用以下内容简化示例:
var a = Task.Delay(2000);
var b = Task.Delay(2000);
await a; // Waits 2 seconds for first delay.
await b; // Finished immediately as 2 seconds passed.
与:
await Task.Delay(2000); // Waits for 2 seconds
await Task.Delay(2000); // Waits for another 2 seconds