如何检索信号量的名称

时间:2012-04-26 17:19:40

标签: c# multithreading semaphore

我的代码在初始化时创建了许多信号量。每个都与我的系统将从多个工作流程通信的ftp服务器相关联。 随着相同工作流的不同实例开始,我将信号量注入到工作流中,具体取决于工作流将要与之通信的ftp站点。

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

我已经命名了Semaphores,因为我认为我可以在建立ftp连接的位置检索名称,这样我就可以检查正确的Semaphore是否在正确的工作流程中。

如何访问信号量的名称?

我尝试构建一个继承自Semaphores的对象并添加一个名称字段,但这不起作用,因为Semaphore是Sealed

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

3 个答案:

答案 0 :(得分:2)

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

 public static readonly Dictionary<Semaphore, string> SemaphoreNames 
            = new Dictionary<Semaphore,string>();

...
    Semaphore sem = new Semaphore(0, 200);
    SemaphoreNames[sem] = "Bob";
...

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

答案 1 :(得分:2)

如果您使用的是.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; }
}

答案 2 :(得分:0)

我接受了这个。

public class SemaphoreSlimNamed : SemaphoreSlim
{
    public string name;

    public SemaphoreSlimNamed(int InitialCapacity, int MaxCapacity) : base(InitialCapacity, MaxCapacity)
    {

    }
}

感谢您的建议