【发布时间】:2014-11-01 03:30:16
【问题描述】:
我创建了以下内容,以便在超时的情况下执行多个异步任务。我一直在寻找可以从任务中提取结果的东西——只取那些超过超时的,不管其余任务是否失败(简化):
TimeSpan timeout = TimeSpan.FromSeconds(5.0);
Task<Task>[] tasksOfTasks =
{
Task.WhenAny(SomeTaskAsync("a"), Task.Delay(timeout)),
Task.WhenAny(SomeTaskAsync("b"), Task.Delay(timeout)),
Task.WhenAny(SomeTaskAsync("c"), Task.Delay(timeout))
};
Task[] completedTasks = await Task.WhenAll(tasksOfTasks);
List<MyResult> = completedTasks.OfType<Task<MyResult>>().Select(task => task.Result).ToList();
我已经在(Web API)服务器的一个非静态类中实现了这个。
这在第一次调用时效果很好,但是额外的调用导致completedTasks 奇怪地从以前的服务器调用中累积任务(如调试器所示)。第二次调用完成了 6 个任务,第三次调用了 9 个,依此类推。
我的问题:
- 知道这是为什么吗? 我认为这是因为之前的任务没有被取消,但是这段代码在一个类的新实例中!
- 知道如何避免这种积累吗?
PS:见我对this问题的回答。
【问题讨论】:
-
我已经编辑了另一个问题 - stackoverflow.com/questions/25716156/…。请仔细阅读这两个问题,您会发现这是两个不同的问题(+ 具有不同的代码段)。
标签: c# .net timeout task-parallel-library async-await