【问题标题】:How to check whether a SemaphoreSlim can be entered?如何检查是否可以输入 SemaphoreSlim?
【发布时间】:2016-01-13 09:23:20
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# multithreading semaphore


    【解决方案1】:

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

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

    【讨论】:

    • 我刚刚检查了 Reference SourceWait(int millisecondsTimeout, CancellationToken cancellationToken) 有一个特殊情况 0 毫秒快速失败。
    • @Johnbot: 万岁 :) 感谢您的检查。
    【解决方案2】:

    MSDN 中明确提及。

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

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      相关资源
      最近更新 更多