如何创建一个在触发特定事件时不运行的函数

时间:2015-01-18 02:20:18

标签: c# .net events unity3d

编辑:为了澄清,这是在Unity中,并与Update()绑定。因此,对于任意数量的帧,每帧将触发一次事件。这两个事件都可以由用户独立触发,但是可以触发两个事件的重叠。在这种情况下,我只想要实际运行两个事件所调用的两个方法中的一个。

我尝试创建一个由一个事件调用的方法,并且第二个事件调用的其他方法的链接方式只能同时调用或运行这两个方法中的一个。

事件由用户的动作触发,两个事件可以同时触发。但是,如果两个事件都被触发,我只想要调用两个方法中的一个实际运行。

我正在考虑以下示例中的某些内容,显然这个示例可能不准确,但我想要完成的要点就在那里。

伪代码示例:

public delegate void OneHandler();
public event OneHandler OneEvent;
private void One()
{
    if(some requirement && TEvent != null)
    {
        TEvent();
    }
}

public delegate void TwoHandler();
public event TwoHandler TwoEvent;
private void Two()
{
    if(some requirement && TEvent != null)
    {
        TEvent();
    }
}

SomeClass.OneEvent += ActionOne();
SomeClass.TwoEvent += ActionTwo();


private void ActionOne()
{
    if(TwoEvent is not firing)
    {
        Do Something;
    }
}

private void ActionTwo()
{
    if(OneEvent is not firing)
    {
        Do Something;
    }
}

粗略的图表。棕褐色区域向下/向左移动,绿色区域沿对角线移动。我基本上希望棕褐色区域有自己的事件,如果鼠标在整个区域内,则不要运行它们的方法。

enter image description here

3 个答案:

答案 0 :(得分:2)

事件一次触发一次,而不是一次触发。即使相同的用户操作会导致两个事件一个接一个地触发,也无法知道两个事件都会触发,或者它们将以什么顺序触发。


更清楚:我并不是说事件永远不会同时发生。我的意思是,一般来说,没有一段代码能够针对特定情况确定将被触发的完整事件集。你不能提前告诉哪个会触发,或者以什么顺序,甚至在哪个线程上。

例如,特定的用户界面操作(或用户手势)可能会导致触发多个事件。一般而言,您不能依赖于要触发的事件数量,也不能取决于它们被触发的顺序。

在某些情况下,例如在ASP.NET网络表单中,您可以放心,如果用户单击具有Click事件处理程序的按钮,则会发生页面Load事件然后按钮Click事件将触发。但这是因为这种行为是以这种方式定义和记录的。如果订单发生更改,或者例如页面Load事件停止触发,则会破坏大量ASP.NET Web表单应用程序。

答案 1 :(得分:1)

如果您要做的就是保证永远不会允许并发触发(比如在不同内核上运行的两个线程),那么您将需要使用类似互斥锁的东西。您可以让两个处理程序执行WaitOne(0)以查看其他处理程序是否正常工作,如果调用返回false则立即返回(因为另一个方法必须执行)然后在保证执行块(例如最后一个)中会释放互斥锁。

答案 2 :(得分:0)

如何使用bool变量作为标志?

private bool flag[2] = [false, false];

private void ActionOne()
{
    flag[0] = true;        
    if(!(flag[0])&&flag[1]))
    {
        Do Something;
    }
    flag[0] = false;
}

private void ActionTwo()
{
    flag[1] = true;
    if(!(flag[0] && flag[1]))
    {
        Do Something;
    }
    flag[1] = false;
}