gpt4 book ai didi

c# - 完成后如何从集合中删除任务

转载 作者:太空狗 更新时间:2023-10-29 20:53:24 25 4
gpt4 key购买 nike

假设我有一个 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));

由于 Task 在完成后仍处于 TaskStatus.RanToCompletion 状态,而不是消失,因此它们将保留在集合中,直到被明确删除,并且集合将无限增长。需要修剪 Task 以防止出现这种情况。

我研究过的一种方法是让 Task 访问集合并让它在最后删除自己。但我也在研究一种架构,在该架构中我必须删除我的组件尚未创建的任务。我的第一个想法是为每个任务的完成附加一个触发器或事件,如下所示:

foreach (Task task in createdSomewhereElse)
{
lock (myTasks) myTasks.Add(task);
task.WhenTaskIsCompleted +=
(o, ea) => { lock(myTasks) myTasks.Remove(task); };
task.Start();
}

...但是 Task 没有这样的事件。有什么好方法可以完成我正在寻找的东西吗?像这样:

最佳答案

您当然可以在任务完成时附加触发器:Task.ContinueWith (及其通用等价物)。这对您来说可能就足够了。

可能还希望将ConcurrentDictionary 用作一种穷人的并发集——这样您就不必在访问集合时锁定。迭代时只需使用 Keys 属性,并使用您喜欢的任何值作为值。

关于c# - 完成后如何从集合中删除任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6032971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com