2012-04-26 9 views
0

私のコードは、初期化時に多数のセマフォを作成します。それぞれは私のシステムが複数のワークフローから通信するftpサーバに関連付けられています。 同じワークフローの異なるインスタンスが開始されると、ワークフローがどのFTPサイトと通信するかに応じて、ワークフローにセマフォを挿入します。セマフォの名前を取得する方法

同じセマフォを含む2つ以上のワークフローのように見える状況が発生しました。セマフォの容量よりも多くの時間がFTPサーバーにアクセスしようとしています。

私は、正しいセマフォが正しいワークフローにあることを確認できるように、ftp接続が確立された時点で名前を取得できると思ったので、セマフォの名前を付けました。

セマフォの名前にアクセスするにはどうすればよいですか?

私はセマフォを継承したオブジェクトを作成し、名前フィールドを追加しようとしましたが、これは何とか自分のセマフォに名前を付けるために、デバッグ目的であるので、セマフォをすることができます、

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

ため

public class SemaphoreSlimNamed : SemaphoreSlim { public string name; public SemaphoreSlimNamed(int InitialCapacity, int MaxCapacity) : base(InitialCapacity, MaxCapacity) { } } 

おかげであなたがやっているまさに不明です。セマフォの使い方に関するコードを投稿してください。 – cadrell0

+0

スレッドの代わりにセマフォを使用しているようです。 –

+0

どちらか分かりません。各ワークフローは異なるプロセスですか? –

答えて

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

を封印されている、これは動作しません。つまりあなたは[someSemaphore] SemaphoreNamesから自分の名前にアクセスすることができます

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

... 
    Semaphore sem = new Semaphore(0, 200); 
    SemaphoreNames[sem] = "Bob"; 
... 

を使用し、セマフォ構築時に各セマフォをキーとする辞書を使用しています。これがちょうどデバッグのために使用されているなら、私は#ifdef DEBUGと#endifの間に余分な行を置きます。

関連する問題