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