2012-04-26 3 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 사이에 여분의 줄을 추가 할 것입니다.

0

나는 함께 갔다. 당신이 일을 정확히 불분명

관련 문제