两个并行等待参数

Two parallel await arguments

谁能解释一下这两个块之间的区别。

这个执行大约 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 之前开始 两个任务,第二个 "waits" 直到第一个任务完成然后开始第二个。

第一个代码示例:

// 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。然后它在逻辑上接受等待的任务,将方法的其余部分添加为延续和 returns 代表整个操作的任务。

当您 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