两个并行等待参数



有人可以解释一下这两个块之间的区别吗?

这个执行大约 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

最新更新