2012-04-26 51 views
0

的名字我的代碼創建了一些信號燈,當它初始化。每一個都與我的系統將從多個工作流程進行通信的ftp服務器相關聯。 由於不同的相同工作流程的情況下,我開始注入信號燈到工作流根據工作流會與之通信的FTP站點。如何取回的信號量

我得到的情況下,它看起來像2個或多個工作流程應包含相同的信號量正試圖多次訪問FTP服務器比信號量的能力應該允許。

,因爲我認爲我可以在其中建立FTP連接後,這樣我可以檢查正確的信號量是在正確的工作流程中的點檢索名字我命名的信號量。

如何訪問一個信號燈的名字嗎?

我試圖建立從信號量繼承的對象,然後添加一個名稱字段,但由於信號燈是密封

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

目前尚不清楚你在做什麼。請張貼一些關於你如何使用信號量的代碼。 – cadrell0 2012-04-26 17:27:01

+0

它看起來像你正在使用信號來代替線程。 – 2012-04-26 17:27:31

+0

我也不明白。每個'工作流程'是不同的過程? – 2012-04-26 17:44:56

回答

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

因爲這是進行調試,以某種方式命名信號燈這不起作用,你可以使用的旗語建設各信號燈鍵一本字典,即使用

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

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

您可以從SemaphoreNames [someSemaphore]訪問他們的名字。如果這只是用於調試,我會在#ifdef DEBUG和#endif之間放置額外的行。

0

我跟着去了。

public class SemaphoreSlimNamed : SemaphoreSlim 
{ 
    public string name; 

    public SemaphoreSlimNamed(int InitialCapacity, int MaxCapacity) : base(InitialCapacity, MaxCapacity) 
    { 

    } 
} 

感謝您的建議