2015-10-15 55 views
2

我想要以SemaphoreSlim方式分配对象列表,例如假设每个对象可以被两个线程同时使用。我的计划是为列表中的每个对象创建一个SemaphoreSlim类,但是接下来我的问题是如何检查SemaphoreSlim是否可以立即使用?如何检查是否可以输入SemaphoreSlim?

我不想调用Wait(),因为如果一个对象不可用,我可以移动到列表中的下一个对象。我不想检查CurrentCount属性,因为如果多个线程同时检查CurrentCount并且决定在CurrentCount大于零时调用Wait(),我认为它不会是线程安全的。

那么这种情况下理想的解决方案是什么?

顺便说一句 - 我可以使用其他解决方案 - 不只是SemaphoreSlim。

回答

5

嫌疑人你可以使用Wait(TimeSpan.Zero)来说“试图获得信号量,但如果你不能马上这样做就放弃尝试。”

这将是我的期望,但文档没有明确说明如果通过TimeSpan.Zero会发生什么情况。 IMO至少应该进一步调查这一选择。

+0

我刚刚检查过[参考源代码](http://referencesource.microsoft.com/mscorlib/system/threading/SemaphoreSlim.cs.htm)和'Wait(int millisecondsTimeout,CancellationToken cancellationToken)'''' 0毫秒,快速失败。 – Johnbot

+0

@Johnbot:Hooray :)感谢您的检查。 –