【发布时间】:2011-05-22 22:07:32
【问题描述】:
假设我有一个System.Threading.Tasks.Task 的集合:
HashSet<Task> myTasks = new HashSet<Task>();
...我会定期向集合中提供更多数据,因为我有更多需要处理的数据:
foreach (DataItem item in itemsToProcess)
myTasks.Add(
Task.Factory.StartNew(
() => Process(item),
cancellationToken,
TaskCreationOptions.LongRunning,
TaskScheduler.Default));
由于Tasks 在完成后仍保持TaskStatus.RanToCompletion 状态而不是消失,因此它们将保留在集合中,直到被明确删除,并且集合将无限增长。 Tasks 需要被修剪以防止这种情况发生。
我研究过的一种方法是让Task 访问该集合并让它在最后自行删除。但我也在研究一种架构,在该架构中我必须删除我的组件尚未创建的任务。我的第一个想法是为每个任务的完成附加一个触发器或事件,如下所示:
foreach (Task task in createdSomewhereElse)
{
lock (myTasks) myTasks.Add(task);
task.WhenTaskIsCompleted +=
(o, ea) => { lock(myTasks) myTasks.Remove(task); };
task.Start();
}
...但是Task 没有这样的事件。有什么好方法可以完成我正在寻找的东西吗?像这样的:
【问题讨论】:
标签: c# .net-4.0 task-parallel-library