如何检索信号灯的名称
本文关键字:信号灯 检索 何检索 | 更新日期: 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)
{
}
}
感谢您的建议