2017-04-19 15 views
0

Unity(C#)でゲームを開発していて、C#イベントに依存してゲームの状態を更新しています。C#イベントの実行順序(Unity3Dゲーム)

次のシナリオを検討してください:?

// 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"); 
    } 
} 

それは出力が常にA B Cなること保証ですかまたは、イベントサブスクライバの実行(HandleCellLetterSet())が次のフレームまで遅れてA C Bになることはありますか?


EDIT:BA.LetterSetの唯一の加入者です。質問は複数の加入者間の実行順序に関するものではありません。

+1

ある呼び出しから次の呼び出しまで、特定の順序で実行されているハンドラーに依存することはできません。これは本当に危険であり、理解できないコードのパスにつながります。あなたが本当に必要なら[イベントチェーン](https://www.codeproject.com/Articles/27406/Event-Chain)を見てください。 – Smartis

+1

@Smartisを参考にしていただきありがとうございます。混乱を避けるために、コードには1つのイベント加入者しか含まれていないことを明確にするための質問を編集しています。質問は、複数のサブスクライバ間の実行順序についてではなく、イベントをトリガする動作とサブスクライバでコードを実行する動作の間の実行順序に関するものです。 –

答えて

1

はい、ポストに示されているような同期イベントハンドラは、イベントがトリガされたコードに戻る前に、順番に(ある順序で - Order of event handler execution)実行した後に終了することが保証されています。

あなたのコードはA、B、Cを印刷することが保証されています。

その他のリンク:are C# events synchronous?、イベントを非同期にする - Should I avoid 'async void' event handlers?、非同期イベントを待っています - Asynchronous events in C#