Как подсчитать активные потоки в массиве и избежать ошибок «коллекция была изменена»? - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть коллекция потоков в C # (List<Thread>), в которые через определенные промежутки времени я хочу получить число из них, которые активно работают.

В настоящее время я устанавливаю отдельные потоки на ноль, когда онизавершены.Поэтому:

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

Я пытаюсь использовать lock, чтобы избежать ошибки «Сбор был изменен», но это не работает.Время от времени я все еще получаю эту ошибку.

Есть что-то еще, что может быть лучше?

Ответы [ 2 ]

7 голосов
/ 07 февраля 2012

Я бы просто использовал блокированный счетчик; увеличьте это (Interlocked.Increment) перед запуском каждого потока, и пусть каждый поток вызывает Interlocked.Decrement непосредственно перед выходом. Затем вы можете использовать Thread.VolatileRead в любой момент, чтобы узнать, сколько из них активно, без какой-либо коллекции.

Однако, специально для решения вопроса: если вы используете коллекцию, потоки, устанавливающие элемент в null, тоже должны блокироваться:

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

Счетчик кажется мне чище.

1 голос
/ 08 февраля 2012

Ваш код:

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

действует только тогда, когда все другие операции на ThreadCollection также заключены в оператор lock().

чтобы избежать ошибки "Коллекция была изменена"

означает, что вы этого не делаете, ошибка происходит из другого фрагмента кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...