【问题标题】:Sort Tasks into order of completition将任务按完成顺序排序
【发布时间】:2013-06-05 11:41:48
【问题描述】:

大约一年前,我看到 Jon Skeet 发表演讲,他展示了 C# 5 的 sn-p,它将获取任务列表并按照它们完成的顺序返回它们。

它使用了 async/await 和 WhenAny,非常漂亮,但我一生都记不起它是如何工作的。现在我需要它。

我希望弄清楚如何创建一个签名与此类似的方法..

Task<IEnumerable<T>> InOrderOfCompletion<T>(IEnumerable<T> tasks) where T : Task

并且可以如下使用:

public async Task<int> DelayedInt(int i)
{
    await Task.Delay(i*100);
    return i;
}

[Test]
public async void Test()
{
    Task<int>[] tasks = new[] {5, 7, 1, 3, 2, 6, 4}.Select(DelayedInt).ToArray();
    IEnumerable<Task<int>> ordered = await InOrderOfCompletion(tasks);

    Assert.That(ordered.Select(t => t.Result).ToArray(), Is.EqualTo(new [] {1,2,3,4,5,6,7}));
}

我想出了以下方法,但感觉不像我记得的那么简单

    async Task<IEnumerable<T>> InOrderOfCompletion<T>(IEnumerable<T> tasks) where T : Task
    {
        HashSet<Task> taskSet = new HashSet<Task>(tasks);
        List<T> results = new List<T>();
        while(taskSet.Count > 0)
        {
            T complete = (T) await Task.WhenAny(taskSet);
            taskSet.Remove(complete);
            results.Add(complete);
        }
        return results;
    }

有谁记得知道我所指的 sn-p 或如何改进它?

【问题讨论】:

    标签: c# asynchronous task-parallel-library


    【解决方案1】:

    Jon SkeetStephen Touband I 的方法都略有不同。如果你不想自己写,我的地址是 available via NuGet

    其实,关键是避免 Task.WhenAny,因为这会将算法从 O(N) 变成 O(N^2)。

    【讨论】:

    • 谢谢,这正是我所追求的,非常聪明的东西。
    猜你喜欢
    • 1970-01-01
    • 2019-06-24
    • 2014-05-10
    • 1970-01-01
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多