2009-06-15 91 views
0

我是遠程處理相關的新手(2.0 C#)。有沒有/可以將服務器端對象/實例鎖定到一個客戶端?遠程處理(服務器端)

我最多有10個客戶端連接到服務器。服務器將提供3個不同的任務/操作/類,如果一個客戶端發出請求,並且如果服務器沒有處理該請求,那麼我會將此操作鎖定到該客戶端。原因是這些請求與硬件一起使用,只能在當時處理任務。希望你明白我喜歡的事情。

編輯:

I'll嘗試重新解釋我的問題...

我有3個班,將有方法/操作的X號(操作將觸發外部硬件做一些測量)。當客戶端「連接」到一個類(當時)並請求執行測量時,我想將該類鎖定到客戶端,因此,客戶端將擁有該類,並且它應該能夠執行所有方法。在第一個客戶端有控制權的情況下,其他客戶端不能訪問此類。其他兩類應該對其他客戶的請求開放,但這些類別應適用相同的原則/規則。一旦客戶請求鎖定,只要它需要它就應該有。我將擁有一個所有客戶都必須遵循的內在要求。調用一個名爲Lock()的方法來要求對該類進行控制,並使用Unlock()釋放該控件。我/我們將開發所有客戶端和服務器!

感謝您的所有幫助,迄今爲止!

問候

/安德斯

+0

無論如何,我會建議你使用,如果你能代替WCF遠程處理。 – jmservera 2009-06-15 08:05:47

+0

不能使用WCF!必須在2.0中完成:( – anra 2009-06-15 08:08:20

回答

0

你必須使用信號量,以確保在同一時間只有一個線程鎖定任務。看看SemaphoreMutex類。


編輯: 您可以從鎖定到複雜的信號量做的方法很多,在這裏你有兩個樣本:

這一個唯一的鎖,以確保一次執行都是一次性完成的:

private static object lockObject=new object(); 
public void Test() 
{ 
    lock (lockObject) 
    { 
    //your code here 
    } 
} 

這個人使用一個Mutex來等待它被釋放,但是超時會返回一些信息給客戶端,指示該方法不能被執行。

private static Mutex mutex = new Mutex(); 
public bool Test2() 
{ 
    if (!mutex.WaitOne(500)) 
    { 
    return false; 
    } 
    try 
    { 
    //your code here 
    } 
    finally 
    { 
    mutex.ReleaseMutex(); 
    } 
    return true; 
} 
+0

我應該使用WellKnownObjectMode.SingleCall還是WellKnownObjectMode.Singleton與此解決方案? – anra 2009-06-15 06:54:50

+0

它看起來像你的對象將是一個Singleton。在這種情況下,你也可以使用一個靜態計數器和一個鎖定你的方法 – jmservera 2009-06-15 07:01:18

0

好的,現在我明白了。

您可以使用CAO方法代替:創建一個工廠(可以是單例),如果沒有其他人擁有實例,則可以爲您提供CAO(客戶端激活對象)。CAO對此很有幫助,因爲它可以確保如果客戶死亡,CAO將被釋放。一個簡單的答案,解釋一個CAO太多了,它是這樣的:CAO是一個從MarshalByRefObject繼承的類,您將從工廠創建並從一個方法返回實例(即:您的Lock方法);該對象位於服務器中,客戶端只接收代理。當客戶端正在刷新租約時,該對象將進入服務器(在引用對象並且客戶端處於活動狀態時自動完成)。

您可以查看Ingo Rammer's articles以及關於遠程處理的書籍。

0

jmservera,謝謝你的幫助。

我現在已經找到了解決方案,將爲我工作...我使用代理模式結合工廠模式。我使用WellKnownObjectMode.Singleton方法,以便可以控制我的服務器上有多少活動實例。

通過這樣做,我不需要分享我的代碼與客戶端,只有界面(如你之前所說)。

問候

/安德斯