C# 如何使函数在触发特定事件时不运行

C# 如何使函数在触发特定事件时不运行,c#,.net,events,unity3d,C#,.net,Events,Unity3d,编辑:为了澄清,这是统一的,与Update()绑定。因此,对于任意数量的帧,每帧将触发一次事件。这两个事件都可以由用户独立触发,但两者之间存在重叠。在本例中,我只希望两个事件调用的两个方法中的一个实际运行 我试图使一个被一个事件调用的方法和另一个被第二个事件调用的方法以一种只有这两个方法中的一个可以同时被调用或运行的方式进行链接 事件由用户的操作触发,两个事件可以同时触发。但是我只想要两个方法中的一个,如果两个事件都被触发的话,它将被调用以实际运行 我一直在思考下面的例子,显然这个例子可能不准确

编辑:为了澄清,这是统一的,与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();
    }
}


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


使用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;
}

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

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


更清楚地说:我不是说事件永远不能同时触发。我的意思是,在一般情况下,没有一段代码可以确定特定情况下将触发的完整事件集。你不能提前知道哪个会被触发,或者按照哪个顺序,甚至是在哪个线程上

例如,特定的用户界面操作(或用户手势)可能会引发多个事件。一般来说,您不能依赖于要激发的事件的数量或激发顺序


在某些情况下,例如在ASP.NET web表单中,您可以确信,如果用户单击具有
单击
事件处理程序的按钮,页面
加载
事件将触发,然后按钮
单击
事件将触发。但这是因为这种行为是这样定义和记录的。如果顺序发生更改,或者,例如,如果页面
Load
事件停止触发,则会中断大量ASP.NET web窗体应用程序。

如果事件来自同一线程,则永远不会同时调用它们。我不确定这是否是您的情况。据我所知,您希望确保不对同一帧执行两个特定事件。重置每帧发生一次的功能中的联锁标志。()然后尝试联锁测试并在事件中设置。对于任何给定的帧,只有第一个将成功。如果一个事件无法获取标志,它应该简单地退出。我看到了一个线程问题,在这里:如果你执行检查,然后你的线程立即挂起,然后其他处理程序执行检查,会怎么样?是的-你需要互锁访问标志。尽管我敢打赌提问者的目标是UI(在这种情况下,您保证是单线程的),并非所有可以触发事件的情况都必须是UI驱动的。在多线程环境中使用的类(例如,运行消息处理服务器的多核盒子)理论上可以同时执行两个事件。我要澄清一下。我不是说它们永远不能同时触发。我的意思是,一般来说,对于特定情况,没有一段代码可以确定将触发的完整事件集。你无法提前知道哪个事件将触发,或者按照哪个顺序,甚至是哪个事件线程。这是统一的,我通过鼠标指针位置触发一个事件。如果鼠标位于某个位置,每帧更新()时两个事件都会触发一次。我需要两个被触发的方法中的一个具有“优先级”,如果两个事件都触发(并且两个方法都被调用)只有一种方法会真正运行。除非Unity定义了事件的顺序或定义了两个事件都会触发,否则你就不走运了。这是事件驱动编程的一个相当基本的部分。这很像为中断驱动的架构开发设备驱动程序。不要依赖顺序。我的观点是,一般来说,在e不是“由于给定触发器而执行的处理程序集”的概念。我可以设想一个子系统来定义这样一个概念。它可以允许开发人员干预并自定义将执行哪些处理程序。但我从未见过这样的子系统。嘿,安迪,谢谢你的回答。让我澄清一下。这是统一的,两个事件都与Update()有关,并将每帧触发一次。用户可以同时触发这两个事件,同时调用这两个方法(同时,我指的是在一个帧中同时调用这两个方法)。我正在尝试找出一种不混乱的方法来阻止这两个方法运行。因此,如果事件1和事件2触发器位于同一帧上,则只有方法事件2将调用实际运行。这也与鼠标位置有关,因此,无论鼠标在该位置多长时间,事件都将触发每一帧。好的,这就不太重要了“同时”和更多关于“与”
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;
}