【问题标题】:Two parallel await arguments两个并行等待参数
【发布时间】:2015-04-13 15:33:37
【问题描述】:

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

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

我无法理解它们有何不同。为什么稍后分配等待任务然后创建它会影响执行顺序。

【问题讨论】:

  • 您使用的是什么测试运行器?如果您的测试方法是 async void,那么测试运行程序如何跟踪正在运行的任务?
  • NUnit,完美运行。

标签: c# asynchronous async-await task-parallel-library task


【解决方案1】:

第一个开始两个任务在await'ing 之前,第二个“等待”直到第一个任务完成,然后开始第二个。

第一个代码示例:

// 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);

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多