2

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 であるため、両方の操作は別々のリモート プロシージャ コールです。それらは別のスレッドで実行されますか? はいの場合、操作 1 が終了する前に操作 2 が実行される可能性はありますか?

PS: MyRemotedClass MarshalByRef を作成するのは悪い決定です。しかし、それを変更することはできませんので、提案しないでください。

4

2 に答える 2

2

私はこれの専門家ではありませんが、ファンキーな非同期動作が発生していない限り、クライアント イベントが書き込みを試みる前に書き込みが確実に完了することを期待しています。MyIntMyString

結局のところ、何らかの理由で割り当てが失敗した場合、続行する前に例外をスローする唯一の賢明な処理方法は、IMO.

于 2009-02-08T08:49:29.693 に答える
2

実際、私が考える限り、2 つのプロパティの設定は非同期的に行われていないため、クライアントは最初の RPC が終了するまで待ってから RPC 2 で開始します。

いずれにせよ、MyRemotedClass がシングルトン サーバーでアクティブ化されたオブジェクトとして構成されていない場合は、MyRemotedClass で実行するすべての RPC に対して、新しいインスタンスがサーバー上に作成されることにも注意してください。つまり、リモート オブジェクトに状態が含まれてはならないということです。

于 2009-02-08T09:24:18.250 に答える