2009-06-15 10 views
0

リモートでは比較的新しいです(2.0 C#)。 1つのクライアントにサーバーサイドのオブジェクト/インスタンスをロックするための/ somewayはありますか?Remoting(サーバー側)

サーバーに接続するクライアントが最大10台あります。サーバーは3つの異なるタスク/操作/クラスを提供し、1つのクライアントが要求を行い、サーバーがそれに取り組んでいない場合、この操作をそのクライアントにロックしたいと思うでしょう。その理由は、リクエストはその時点でタスクを処理できるHWで動作するためです。私が好きなことを理解してくれることを願っています。

EDIT:

- 私は...再び私の問題を説明するために

を試してみてください私は、外部ハードウェアをトリガーする方法/操作(オペレーションのX番号を持っています3つのクラスを持っていますいくつかの測定を行う)。クライアントが(ある時点で)あるクラスに「接続」して実行する測定を要求すると、そのクラスをクライアントにロックしたいので、クライアントはこのクラスを所有し、すべてのメソッドを実行できるようになります。最初のクライアントが制御権を持っている間に、他のクライアントはこのクラスにアクセスすることができません。他のトウクラスは、他のクライアントからの要求に対してオープンであるべきであるが、同じ原則/ルールがこれらのクラスに適用される。クライアントがロックを要求するとすぐに、ロックを必要とする限りそれを保持します。私はすべてのクライアントが従わなければならない内面を持つでしょう。クラスを制御するにはLock()メソッドを呼び出し、コントロールを解放するにはUnlock()メソッドを呼び出します。私/私たちはすべてのクライアントとサーバーを開発します!

これまでのすべての助けをありがとう!一度に一つだけのスレッドを保証するためにセマフォを使用してタスクをロックする必要が

よろしく

/アンダース

+0

とにかく私はあなたができればWCFは、代わりにリモーティング使用することをお勧めします。 – jmservera

+0

WCFを使用できません! 2.0で実行する必要があります:( – anra

答えて

0

SemaphoreMutexクラスを見てください。


編集: あなたは、複雑なセマフォをロックするから多くの方法を行うことができますが、ここでは次の2個のサンプルがあります

この1つの実行が一度に行われていることを保証する唯一のロック:

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

+0

オブジェクトがシングルトンになるようですが、この場合は静的カウンタとメソッドのロックを使用できます – jmservera

+0

こんにちは、ありがとうございました...しかし、私はあまりにも彼らが私の望むように働くようには思わない... – anra

0

[OK]をクリックします。

CAOのアプローチを代わりに使用することができます。他の誰もインスタンスを所有していない場合は、CAO(クライアントアクティブ化オブジェクト)を提供するファクトリを作成します(シングルトンにすることもできます)。 CAOは、クライアントが死亡した場合にCAOが解放されることを保証するため、これに適しています。

CAOを説明するのはあまりにも単純です。CAOはMarshalByRefObjectから継承したクラスで、工場から作成して1つのメソッド(つまり、Lockメソッド)からインスタンスを返します。オブジェクトはサーバー内に存在し、クライアントはプロキシのみを受け取ります。オブジェクトは、リースがクライアントによって更新されている間にサーバーに保存されます(オブジェクトが参照されている間に自動的に実行され、クライアントが生きている)。

Ingo Rammer's articlesとリモーティングに関する書籍をご覧ください。

+0

私はCAOについて少し前に読んだことがありますサーバーとクライアントの間ですべてのリモーティングコードを共有する必要があるため、スケーラビリティが制限され、強固な結合が得られます。 – anra

+1

あなたはコードを共有する必要はなく、Interfaceを使ってCAOのメソッドとプロパティを定義するだけでよいのです。インターフェイスとdllを共有すると、SAOオブジェクトと同じです。 – jmservera

0

jmservera、ご協力いただきありがとうございます。

私は今、私のために働く解決策を見つけました...私は工場パターンと組み合わせたプロキシパターンを使用しています。私はWellKnownObjectMode.Singletonメソッドを使用して、自分のサーバー上にあるアクティブインスタンスの数を制御できます。

これを行うことで、クライアントとコードを共有する必要はありません。以前のようにインターフェイスのみを共有する必要はありません。

よろしく

/アンダースは

+0

それは働いて知ってうれしい! 乾杯! – jmservera