0

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

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

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

如何访问信号量的名称?

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

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

3 回答 3

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; }
}
于 2012-04-26T18:05:52.600 回答
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 之间放置额外的行。

于 2012-04-26T17:30:37.657 回答
0

我带着这个去了。

public class SemaphoreSlimNamed : SemaphoreSlim
{
    public string name;

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

    }
}

感谢您的建议

于 2012-04-27T10:05:05.890 回答