如何计算数组中的活动线程数;集合被修改”;错误

本文关键字:线程 集合 错误 修改 活动 何计算 计算 数组 | 更新日期: 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"

表明您没有这样做,错误来自另一段代码。