2015-10-15 2 views
2

Я хочу назначить список объектов в модуле SemaphoreSlim, например. предположим, что каждый объект может использоваться двумя потоками одновременно. Мой план состоит в том, чтобы создать класс SemaphoreSlim для каждого объекта в этом списке, но тогда мой вопрос заключается в том, как проверить, можно ли использовать SemaphoreSlim прямо сейчас?Как проверить, можно ли ввести SemaphoreSlim?

Я не хочу называть Wait(), так как если объект недоступен, я могу перейти к следующему в списке. Я не хочу проверять свойство CurrentCount, поскольку я не думаю, что он будет потокобезопасным, если несколько потоков проверили CurrentCount в одно и то же время и решили вызвать Wait(), если CurrentCount больше нуля.

Итак, каково идеальное решение для этого сценария?

BTW - Я могу использовать другие решения - не только SemaphoreSlim.

ответ

5

I подозреваемый вы можете использовать Wait(TimeSpan.Zero), чтобы сказать «попытайтесь приобрести семафор, но откажитесь от попытки, если вы не можете сделать это немедленно».

Это было бы моим ожиданием, но в документации явно не говорится о том, что произойдет, если вы перейдете в TimeSpan.Zero. Стоит хотя бы расследовать этот вариант дальше, ИМО.

+0

Я только что проверил [Источник ссылки] (http://referencesource.microsoft.com/mscorlib/system/threading/SemaphoreSlim.cs.htm) и 'Wait (int millisecondsTimeout, CancellationToken cancelationToken)' имеет специальный регистр для ' 0' миллисекунды, которые не срабатывают быстро. – Johnbot

+0

@Johnbot: Hooray :) Спасибо, что посмотрели. –