如何检查是否可以输入SemaphoreSlim?

时间:2015-10-15 04:07:56

标签: c# multithreading semaphore

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

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

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

BTW - 我可以使用其他解决方案 - 而不仅仅是SemaphoreSlim。

2 个答案:

答案 0 :(得分:6)

怀疑您可以使用Wait(TimeSpan.Zero)说“尝试获取信号量,但如果您不能立即停止尝试,请放弃尝试。”

这是我的期望,但文档没有明确说明如果你传入TimeSpan.Zero会发生什么。值得至少进一步调查这一选择,IMO。

答案 1 :(得分:2)

MSDN中明确提及。

<块引用>

如果超时设置为零毫秒,则该方法不会阻塞。 它测试等待句柄的状态并立即返回。