2017-04-19 4 views
0

Ich entwickle ein Spiel in Unity (C#) und ich verlasse mich auf C# -Ereignisse, um den Spielstatus zu aktualisieren (d. H., Ob das Spiel nach einer bestimmten Aktion abgeschlossen ist).C# Event Ausführungsreihenfolge (Unity3D Spiel)

sich das folgende Szenario:

// model class 
class A 
{ 
    // Event definition 
    public event EventHandler<EventArgs> LetterSet; 
    protected virtual void OnLetterSet (EventArgs e) 
    { 
     var handler = LetterSet; 
     if (handler != null) 
      handler (this, e); 
    } 

    // Method (setter) that triggers the event. 
    char _letter; 
    public char Letter { 
     get { return _letter } 
     set { 
      _letter = value; 
      OnLetterSet (EventArgs.Empty); 
     } 
    } 
} 

// controller class 
class B 
{ 
    B() 
    { 
     // instance of the model class 
     a = new A(); 
     a.LetterSet += HandleLetterSet; 
    } 


    // Method that handles external (UI) events and forward them to the model class. 
    public void SetLetter (char letter) 
    { 
     Debug.Log ("A"); 
     a.Letter = letter; 
     Debug.Log ("C"); 
    } 

    void HandleCellLetterSet (object sender, EventArgs e) 
    { 
     // check whether the constraints were met and the game is completed... 
     Debug.Log ("B"); 
    } 
} 

Ist es garantiert, dass der Ausgang immer A B C sein? Oder könnte die Ausführung des Ereignisteilnehmers (HandleCellLetterSet()) bis zum nächsten Rahmen verzögert werden, der zu A C B führt?


EDIT: B ist der einzige Teilnehmer A.LetterSet. Die Frage betrifft nicht die Ausführungsreihenfolge zwischen mehreren Teilnehmern.

+1

Sie können sich nicht darauf verlassen, dass die Handler in einer bestimmten Reihenfolge von einem Aufruf zum nächsten ausgeführt werden. Das ist wirklich gefährlich und führt zu einem Weg des nicht verständlichen Codes. Schauen Sie sich [Event Chains] (https://www.codeproject.com/Articles/27406/Event-Chain) an, wenn Sie wirklich müssen. – Smartis

+1

Vielen Dank @Smartis für die Referenz. Um Verwirrung zu vermeiden, bearbeite ich die Frage, um klarzustellen, dass der Code nur einen Ereignisteilnehmer enthält. Die Frage betrifft nicht die Ausführungsreihenfolge zwischen mehreren Teilnehmern, sondern die Ausführungsreihenfolge zwischen dem Auslösen des Ereignisses und dem Ausführen des Codes in den Teilnehmern. –

Antwort

1

Ja, synchrone Event-Handler wie in der Post gezeigt, werden nach der sequenziellen Ausführung (in einer bestimmten Reihenfolge - Order of event handler execution) garantiert beendet, bevor die Ausführung zum Code zurückkehrt, der das Ereignis ausgelöst hat.

So ist Ihr Code garantiert, A, B, C zu drucken.

Weitere Links: are C# events synchronous?, wodurch Ereignis asynchron - Should I avoid 'async void' event handlers?, erwartet für asynchrone Ereignisse - Asynchronous events in C#.