如何检索信号灯的名称

本文关键字:信号灯 检索 何检索 | 更新日期: 2023-09-27 18:32:18

我的代码在初始化时会创建许多信号量。 每个都与一个 ftp 服务器相关联,我的系统将从多个工作流与该服务器进行通信。当同一工作流的不同实例启动时,我会根据工作流将要与哪个 ftp 站点通信的信号量注入工作流。

我遇到的情况是,看起来 2 个或更多应该包含相同信号量的工作流试图访问 ftp 服务器的次数超过信号量容量应该允许的次数。

我命名了信号量,因为我认为我可以在建立 ftp 连接的位置检索名称,以便我可以检查正确的信号量是否在正确的工作流程中。

如何访问信号灯的名称?

我试图构建一个继承自信号量的对象并添加一个名称字段,但这不起作用,因为信号量是密封的

public class MySemaphore : System.Threading.Semaphore
{
   string SemaphoreName = "Bob";
}

如何检索信号灯的名称

如果您使用的是 .NET 4.0,请改用SemaphoreSlim。它没有密封。

如果必须使用Semaphore则必须创建自己的类而不对其进行子类化。例如,您将不得不在多态性上下注,这样它就不会在WaitHandle.WaitAny内工作,但这是一种可行的解决方法。

public class MySemaphore
{
  private Semaphore underlying;
  public MySemaphore(int initialCount, int maximumCount)
  {
    underlying = new Semaphore(initialCount, maximumCount);
  }
  public bool WaitOne()
  {
    return underlying.WaitOne();
  }
  public int Release()
  {
    return underlying.Release();
  }
  public string Name { get; set; }
}

由于这是出于调试目的,因此要以某种方式命名信号量,您可以在信号量构造中使用由每个信号量键入的字典,即使用

 public static readonly Dictionary<Semaphore, string> SemaphoreNames 
            = new Dictionary<Semaphore,string>();
...
    Semaphore sem = new Semaphore(0, 200);
    SemaphoreNames[sem] = "Bob";
...

您可以从 SemaphoreNames[someSemaphore] 访问它们的名称。如果这只是用于调试,我会在 DEBUG 和 #endif 之间放置额外的行 #ifdef。

我同意了这个。

public class SemaphoreSlimNamed : SemaphoreSlim
{
    public string name;
    public SemaphoreSlimNamed(int InitialCapacity, int MaxCapacity) : base(InitialCapacity, MaxCapacity)
    {
    }
}

感谢您的建议