【问题标题】:How can I count active threads in an array and avoid "collection was modified" errors?如何计算数组中的活动线程并避免“集合已修改”错误?
【发布时间】:2012-02-07 19:56:10
【问题描述】:

我有一组 C# (List<Thread>) 中的线程集合,我希望每隔一定时间获取正在积极工作的线程的数量。

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

private int AliveThreads()
{
    lock (ThreadCollection)
    {
        return ThreadCollection.Count(t => t != null);
    }
}

我正在尝试使用lock 来避免出现“集合已修改”错误,但这不起作用。我仍然不时收到此错误。

还有其他更好的方法吗?

【问题讨论】:

  • 您是否有某些原因不只是将它们从集合中删除?
  • @Galactic 他们被重复使用;队列中的作业在线程可用时被分配给线程(空),这样我就可以让例如 20 个线程忙于做某事。
  • 但您实际上并没有重用任何东西,您实际上是在尝试重新创建线程池。如果您刚刚删除了它们,那么只要您的收藏低于阈值,您就会看到是否可以生成更多。

标签: c# multithreading collections


【解决方案1】:

我只会使用联锁计数器; 开始每个线程之前增加这个(Interlocked.Increment),并让每个线程在它们退出之前调用Interlocked.Decrement。然后,您可以随时使用 Thread.VolatileRead 来查看有多少是活动的,而无需任何收集。

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

lock(ThreadCollection)
{
    ThreadCollection[index] = null;
}

柜台对我来说似乎干净得多。

【讨论】:

    【解决方案2】:

    您的代码:

    lock (ThreadCollection)
    {
        return ThreadCollection.Count(t => t != null);
    }
    

    仅在ThreadCollection 上的所有其他操作也被lock() 语句包围时才有效。

    避免出现“收藏已修改”错误

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

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      相关资源
      最近更新 更多