Нет, это не потокобезопасность вообще. Блокировка не имеет никакого эффекта, так как объект является локальным для потока. Это должно быть общим для всех вызывающих потоков. Как только вы исправите это, вам не нужно использовать блокированное приращение, потому что блокировка сериализует выполнение.
Как правило, вы должны размещать locker
на том же уровне, что и ресурс, который вы защищаете. Если ресурс принадлежит экземпляру, тогда должно быть locker
. Аналогично, если ресурс принадлежит классу.
Что касается повторного входа, ключевое слово lock
использует блокировку повторного входа, то есть такую, которая пропускает тот же поток, если блокировка удерживается этим потоком. Это, вероятно, не то, что вы хотите. Но если бы у вас была не входящая блокировка, вы бы просто заблокировали себя повторным входящим вызовом. И я не думаю, что вы тоже этого захотите.
Ты выглядишь так, как будто хочешь обернуть шаг за шагом Пока коллекция не изменяется, это может быть достигнуто с помощью блокированных операций, то есть без блокировки. Если так, то это можно записать так:
do
{
int original = this.NextToExecuteIndex;
int next = original+1;
if (next == this.ReportingAgentsTypes.Count())
next = 0;
}
while (Interlocked.CompareExchange(ref this.NextToExecuteIndex, next, original) != original);
Примечание: Вы должны объявить NextToExecuteIndex
как изменчивый.