我的代码在初始化时创建了许多信号量。每个都与我的系统将从多个工作流程通信的ftp服务器相关联。 随着相同工作流的不同实例开始,我将信号量注入到工作流中,具体取决于工作流将要与之通信的ftp站点。
我遇到的情况是,应该包含相同信号量的2个或更多工作流程试图访问ftp服务器的次数超过信号量应允许的容量。
我已经命名了Semaphores,因为我认为我可以在建立ftp连接的位置检索名称,这样我就可以检查正确的Semaphore是否在正确的工作流程中。
如何访问信号量的名称?
我尝试构建一个继承自Semaphores的对象并添加一个名称字段,但这不起作用,因为Semaphore是Sealed
public class MySemaphore : System.Threading.Semaphore
{
string SemaphoreName = "Bob";
}
答案 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)
{
}
}
感谢您的建议