2010-10-22 32 views
2

Il existe une machine d'état avec deux transitions dans la même fonction. J'ai mis en œuvre mon code machine d'état comme ci-dessusState Machine Question

static readonly object _object = new object(); 

lock (_object) 
{ 
    // I want Host received the event of SMTrans01 first . 
    Obj.StateMachine.Send((int)MyStateMachine.EventType.SMTrans01, new object[2] { Obj, MyStateMachine.EventType.SMTrans01 }); 
} 

lock (_object) 
{ 
    // And then I want Host received the event of SMTrans02. 
    Obj.StateMachine.Send((int)MyStateMachine.EventType.SMTrans02, new object[2] { Obj, MyStateMachine.EventType.SMTrans02 }); 
} 

Je ne suis pas sûr de comprendre correctement la déclaration Lock ou non?

J'ai besoin que les événements suivent le bon ordre (l'hôte a d'abord reçu SMTrans01, puis l'hôte a reçu l'événement SMTrans02). Après le test, j'ai trouvé que l'hôte recevra d'abord l'événement SMTrans02 en premier. On dirait que la déclaration Lock ne fonctionne pas. Je ne sais pas pourquoi.

Y a-t-il de bonnes méthodes pour l'aborder?

+0

Pour le verrouillage, je n'utiliserais pas d'objet statique - ou avez-vous vraiment besoin d'un verrou sur toutes les instances de votre objet? Je considérerais autrement de passer à un vrai singleton à la place et travaillerais toujours sans verrou statique. – weismat

+0

@weismat. Je veux juste contrôler mes événements pour suivre le bon ordre. Je n'ai pas vraiment besoin de 'Lock'. Je suppose que je n'ai pas besoin d'utiliser 'lock' en fait. Mais je ne trouve pas d'autre solution. Je vous remercie. –

Répondre

1

Il semblerait que votre problème n'ait rien à voir avec le filetage et le verrouillage.

Je suppose que votre méthode Send est asynchrone. La solution consiste à utiliser une approche synchrone à la place. N'envoyez pas le second événement avant d'avoir reçu un accusé de réception indiquant que le premier événement a été traité.

Vous pouvez également réécrire votre code de réception afin qu'il puisse gérer les événements en désordre .

Si vous fournissez le code pour Send et de décrire plus comment votre méthode est appelée qui aiderait à déboguer le problème.

+0

Je pense que vous comprenez mon problème complètement. Merci pour votre contribution. Je suis d'accord que mon problème n'a rien à voir avec les threads et le verrouillage. J'essaie juste de trouver une solution. Puis j'ai essayé 'lock'. –

1

si l'ordre des questions

EventType _state = EventType.SMTrans02; 
if(_state == EventType.SMTrans02) 
{ 
_state =EventType.SMTrans01; 
    Obj.StateMachine.Send((int)_state, new object[2] { Obj, _state }); 

} 
else 
{ 
_state = EventType.SMTrans02; 
Obj.StateMachine.Send((int)_state, new object[2] { Obj, _state }); 
} 

pour la situation plus complexe, vous pouvez utiliser le bloc d'interrupteurs ou même utiliser State Pattern

vous avez besoin de verrouillage uniquement pour synchroniser les fils qui peuvent appeler ces événements.

+0

Oui. J'ai eu plusieurs machines d'état et des transitions complexes. Je fais des tests avec votre méthode. Je vous remercie. –