Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C事件执行顺序(Unity3D游戏)_C#_Ios_Events_Unity3d_Thread Safety - Fatal编程技术网

C# C事件执行顺序(Unity3D游戏)

C# C事件执行顺序(Unity3D游戏),c#,ios,events,unity3d,thread-safety,C#,Ios,Events,Unity3d,Thread Safety,我正在Unity C中开发一个游戏,我依靠C事件来更新游戏状态,即:检查游戏是否在给定动作后完成 考虑以下场景: // model class class A { // Event definition public event EventHandler<EventArgs> LetterSet; protected virtual void OnLetterSet (EventArgs e) { var handler = Lette

我正在Unity C中开发一个游戏,我依靠C事件来更新游戏状态,即:检查游戏是否在给定动作后完成

考虑以下场景:

// 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");
    }
}
是否保证输出始终为B C?或者,事件订阅服务器的执行HandleCellLetterSet是否可以延迟到下一帧,从而产生C B


编辑:B是A.LetterSet的唯一订户。问题不在于多个订阅者之间的执行顺序。

是的,本文中所示的同步事件处理程序保证在以某种顺序顺序执行之后,即在执行返回到触发事件的代码之前完成

所以你的代码保证打印A,B,C


更多链接:,使事件异步-,等待异步事件-。

从一次调用到下一次调用,您不能依赖以任何特定顺序执行的处理程序。这是非常危险的,并且会导致代码不可理解。看,如果你真的需要的话。谢谢@Smartis的推荐。为了避免混淆,我正在编辑这个问题,以明确代码只包含一个事件订阅者。问题不在于多个订阅者之间的执行顺序,而在于触发事件的行为和在订阅者中执行代码之间的执行顺序。