chi*_*tom 4 c# asynchronous task-parallel-library
我看到Jon Skeet在大约一年前发表演讲,他在那里展示了一个C#5的片段,它将获取一系列任务并按照他们完成的顺序返回它们.
它使用了async/await和WhenAny并且非常漂亮,但我不能为我的生活记住它是如何工作的.现在我需要它.
我希望弄清楚如何使用类似于此的签名创建方法.
Task<IEnumerable<T>> InOrderOfCompletion<T>(IEnumerable<T> tasks) where T : Task
Run Code Online (Sandbox Code Playgroud)
可以使用如下:
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}));
}
Run Code Online (Sandbox Code Playgroud)
我想出了以下内容,但感觉不像我记得那么简单
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;
}
Run Code Online (Sandbox Code Playgroud)
有人记得知道我所指的片段或如何改进吗?
Ste*_*ary 11
乔恩斯基特,斯蒂芬Toub,我都略有不同的方法.如果您不想自己编写,我可以通过NuGet获取.
实际上,关键是要避免, Task.WhenAny因为这会将算法从O(N)变为O(N ^ 2).
| 归档时间: |
|
| 查看次数: |
827 次 |
| 最近记录: |