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]からアクセスできます。これをデバッグに使用するだけの場合は、#ifdefDEBUGと#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 に答える