如何计算数组中的活动线程数;集合被修改”;错误
本文关键字:线程 集合 错误 修改 活动 何计算 计算 数组 | 更新日期: 2023-09-27 18:23:46
我在C#(List<Thread>
)中有一个线程集合,我想每隔一段时间就得到它们活跃工作的数量。
目前,当单个线程完成时,我将其设置为null。因此:
private int AliveThreads()
{
lock (ThreadCollection)
{
return ThreadCollection.Count(t => t != null);
}
}
我正在尝试使用lock
来避免出现错误"Collection was modified",但这不起作用。我仍然会时不时地犯这个错误。
还有其他更好的吗?
我只需要使用一个互锁计数器;在启动每个线程之前增加this(Interlocked.Increment),并让每个线程在退出之前调用Interlocked.Dincrement。然后,您可以在任何时候使用Thread.VolatileRead来查看有多少处于活动状态,而不需要任何集合。
然而,特别是为了解决这个问题:如果你正在使用一个集合,那么将项目设置为null的线程也应该锁定:
lock(ThreadCollection)
{
ThreadCollection[index] = null;
}
我觉得柜台干净多了。
您的代码:
lock (ThreadCollection)
{
return ThreadCollection.Count(t => t != null);
}
只有当ThreadCollection
上的所有其他操作也被lock()
语句包围时才有效。
以避免出现错误"Collection was modified"
表明您没有这样做,错误来自另一段代码。