C# 如何检索信号量的名称

C# 如何检索信号量的名称,c#,multithreading,semaphore,C#,Multithreading,Semaphore,我的代码在初始化时创建了许多信号量。每一个都与我的系统将从多个工作流与之通信的ftp服务器相关联。 当同一工作流的不同实例启动时,我会根据工作流要与哪个ftp站点通信,将信号量注入到工作流中 我遇到的情况是,两个或多个工作流(应该包含相同的信号量)尝试访问ftp服务器的次数超过了信号量允许的次数 我之所以给信号量命名,是因为我认为可以在ftp连接点检索名称,以便检查正确的信号量是否位于正确的工作流中 如何访问信号量的名称 我试图构建一个从信号量继承的对象,并添加一个名称字段,但这不起作用,因为信

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

我遇到的情况是,两个或多个工作流(应该包含相同的信号量)尝试访问ftp服务器的次数超过了信号量允许的次数

我之所以给信号量命名,是因为我认为可以在ftp连接点检索名称,以便检查正确的信号量是否位于正确的工作流中

如何访问信号量的名称

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

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

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

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

...
    Semaphore sem = new Semaphore(0, 200);
    SemaphoreNames[sem] = "Bob";
...
公共静态只读字典信号量名称
=新字典();
...
信号量sem=新信号量(0200);
信号量名称[sem]=“Bob”;
...

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

因为这是为了调试目的,为了给你的信号量命名,你可以在信号量结构中使用一个由每个信号量键入的字典,即使用

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

...
    Semaphore sem = new Semaphore(0, 200);
    SemaphoreNames[sem] = "Bob";
...
公共静态只读字典信号量名称
=新字典();
...
信号量sem=新信号量(0200);
信号量名称[sem]=“Bob”;
...

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

如果您使用的是.NET 4.0,则使用
信号量lim
。它没有密封

如果必须使用
信号量
,则必须创建自己的类,而不必对其进行子类化。例如,您必须在多态性上下赌注,这样它就不会在
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; }
}

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

如果必须使用
信号量
,则必须创建自己的类,而不必对其进行子类化。例如,您必须在多态性上下赌注,这样它就不会在
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 class SemaphoreSlimNamed : SemaphoreSlim
{
    public string name;

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

    }
}
谢谢你的建议,我同意了

public class SemaphoreSlimNamed : SemaphoreSlim
{
    public string name;

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

    }
}

谢谢你的建议

现在还不清楚你到底在做什么。请发布一些关于如何使用信号量的代码。看起来你用信号量代替线程。我也不明白。每个“工作流”都是不同的过程吗?只是好奇……为什么所有的信号灯都放在首位?@Martin James。它们是WWF workflows@Brian Gideon每个信号灯都是特定ftp站点的守门人(我有50个)。一次可以在系统中移动100个文件,因此我需要限制一次连接到单个ftp站点的次数。保持连接打开和共享不是一个选项,因为有些站点每隔几秒钟使用一次,有些站点不使用几周,这随使用情况而变化。@Srinivas Reddy Thatiparthy No@Cadrell下面的答案已经解决了这个问题。现在还不清楚你到底在做什么。请发布一些关于如何使用信号量的代码。看起来你用信号量代替线程。我也不明白。每个“工作流”都是不同的过程吗?只是好奇……为什么所有的信号灯都放在首位?@Martin James。它们是WWF workflows@Brian Gideon每个信号灯都是特定ftp站点的守门人(我有50个)。一次可以在系统中移动100个文件,因此我需要限制一次连接到单个ftp站点的次数。保持连接打开和共享不是一个选项,因为有些站点每隔几秒钟使用一次,有些站点不使用几周,这随使用情况而变化。@Srinivas Reddy Thatiparthy No@Cadrell10下面的答案已经解决了这个问题。