2009-02-08 6 views
2

Je voudrais savoir comment les threads sont gérés côté serveur en utilisant les objets MarshalByRef.Modèle de threading à remontage NET

Compte tenu de ma classe de MarshalByRef déportée:

public class MyRemotedClass : MarshalByRef 
{ 
    public int MyInt; 
    public string MyString; 
} 

code client (seul thread):

MyRemotedClass m = GetSomehowMyRemotedClass(); 
m.MyInt = 5; // Write operation 1 
m.MyString = "Hello World"; // Write operation 2 

Du côté du serveur, nous avons les deux opérations d'écriture. Je suppose que le fil provient du ThreadPool. Cependant, comme la classe est MarshalByRef, les deux opeations sont des appels de procédure distants distincts. Vont-ils fonctionner sur un fil séparé? Si oui, peut-il arriver que l'opération 2 soit exécutée avant la fin de l'opération 1? PS: Rendre MyRemotedClass MarshalByRef est une décision MAUVAISE. Mais je n'ai pas le droit de changer cela, alors ne le proposez pas.

Répondre

2

Je ne suis pas un expert, mais je voudrais vraiment attendre l'écriture à MyInt d'avoir terminé de manière fiable avant l'événement client tente d'écrire MyString sauf si vous avez un comportement asynchrone froussard passe. Après tout, si l'affectation échoue pour une raison quelconque, la seule façon raisonnable de gérer cela est de lancer une exception avant de continuer, IMO.

2

En effet, pour autant que je pense à ce sujet, le réglage des 2 propriétés ne se produit pas de manière asynchrone, de sorte que le client attend jusqu'à ce que le 1er RPC est terminée avant qu'il commencera par RPC 2.

Quoi qu'il en soit, si votre MyRemotedClass n'est pas configurée comme un objet activé par le serveur singleton, gardez également à l'esprit que pour chaque RPC que vous faites sur MyRemotedClass, une nouvelle instance sera créée sur le serveur. Cela signifie que l'objet distant ne doit contenir aucun état.

+0

Je ne pense pas * qu'il créera une nouvelle instance s'il s'agit de MarshalByRefObject. Tout le point de MBRO (tel que je le comprends) est que seulement une référence est rassemblée, et l'objet lui-même "vit" sur le serveur. –

+0

détaché - donc à distance des services/locations à vie. –