如何计算数组中的活动线程并避免"收集被修改"错误?

JYe*_*ton 2 c# collections multithreading

我在C#(List<Thread>)中有一个Threads集合,在某些时间间隔我想得到它们正在积极工作的数量.

目前,我在完成时将各个线程设置为null.因此:

private int AliveThreads()
{
    lock (ThreadCollection)
    {
        return ThreadCollection.Count(t => t != null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图用来lock避免错误"收集被修改"但这不起作用.我仍然不时得到这个错误.

还有其他可能更好的东西吗?

Mar*_*ell 7

我只想使用一个互锁的柜台; 启动每个线程之前增加此(Interlocked.Increment),并让每个线程在它们退出之前调用Interlocked.Decrement.然后你可以在任何时候使用Thread.VolatileRead来查看有多少是活动的,没有任何集合.

但是,专门用于解决这个问题:如果您正在使用集合,则将项目设置为null的线程也应该锁定:

lock(ThreadCollection)
{
    ThreadCollection[index] = null;
}
Run Code Online (Sandbox Code Playgroud)

柜台对我来说似乎更清洁了.