【问题标题】:Task.WhenAll<TResult[]> Return Order? [duplicate]Task.WhenAll<TResult[]> 返回顺序? [复制]
【发布时间】:2015-07-17 18:05:56
【问题描述】:

我有一系列长时间运行的函数,每个函数都返回一个字符串。我觉得这将是一个任务的理想选择,当我看到Task.WhenAll&lt;TResult[]&gt; 函数时我很兴奋,但我担心它可能是短暂的;鉴于asyncawait 的...异步性质,并且我的要求是该数组中的值具有非常特定的顺序,我需要知道: 如果我等待这个Task.WhenAll&lt;T[]&gt;(...),是否会按照调用Task&lt;T&gt; 的已消耗枚举的顺序或完成的顺序填充结果数组?

编辑

我看到这个问题与一年前提出的this 问题完全相同。该问题的答案也可以在此处找到,但我也会将其发布在此处以提供更好的覆盖范围。

【问题讨论】:

    标签: c# asynchronous task-t


    【解决方案1】:

    正如Yuval 在他对here 问题的回答中所述,答案由MSDN here 提供。为简洁起见;

    答案是数组将按照任务添加到 IEnumerable&lt;Task&lt;T&gt;&gt; 集合的顺序填充,该集合已传递给 Task.WhenAll(...)不是它们的完成顺序。

    【讨论】:

    • 您的解释不正确,顺序是它们传递给函数的顺序。他们等待或完成的顺序对其没有影响。
    • 所以它们被调用的顺序,而不是完成的顺序;对,明白了;已编辑。
    • 不,也不是他们调用的顺序。这是他们在您传递给Task.WhenAllIEnumerable&lt;Task&lt;T&gt;&gt; 中的顺序。我可以到Task&lt;Foo&gt; t1 = GetFooAsync(); Task&lt;Foo&gt; t2 = GetFooAsync(); var result = await Task.WhenAll(new[] {t2, t1});,即使首先调用t1,也会有result[0] == t2.Resultresult[1] == t1.Result。所有这些都是他们传递给WhenAll的顺序
    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多