.NETリモートスレッドモデル
-
22-08-2019 - |
質問
私は、スレッドがMarshalByRefオブジェクトを使用して、サーバー側で処理する方法を知っていただきたいと思います。
私のリモートさMarshalByRefクラスが与えられます:
public class MyRemotedClass : MarshalByRef
{
public int MyInt;
public string MyString;
}
クライアントコード(シングルスレッド):
MyRemotedClass m = GetSomehowMyRemotedClass();
m.MyInt = 5; // Write operation 1
m.MyString = "Hello World"; // Write operation 2
サーバ側では、我々は2つの書き込み操作を持っています。私は、スレッドがThreadPoolのからのものであることを前提としています。クラスはMarshalByRefあるので、両方opeationsは別のリモートプロシージャコールです。彼らは別のスレッドで実行するつもりですか?そうならば、それはその操作2が動作1終了する前に実行されることになるだろう?
発生する可能性がありますPS:作るMyRemotedClass MarshalByRefはBAD決定です。しかし、私はそうそれを提案しないでください、それを変更することはできないのです。
解決
私はこの上の専門家ではないんだけど、私は本当にを期待したい。のクライアントイベントがMyInt
への書き込みしようとする前に、あなたには、いくつかのファンキーな非同期を持っていない限り書き込みが確実に完了したようにMyString
します行動が起こっています。
結局のところ、それを処理する唯一の賢明な方法は、IMO、先に進む前に例外をスローすることです。
他のヒント
確かに、私の知る限り2つのプロパティの設定非同期に起きていないので、クライアントはRPC 2で始まります前に、第一RPCが終了するまで待って、それについて考えるだろうと。
あなたのMyRemotedClassがシングルトンサーバ活性化対象として設定されていない場合は、とにかく、また、あなたがMyRemotedClass上で行うすべてのRPCのために、新しいインスタンスがサーバー上に作成されることに注意してください。これは、リモートオブジェクトがどのような状態を含むべきではないということを意味します。