C#WinForms:一个执行次数超过预期的函数

C#WinForms:一个执行次数超过预期的函数,c#,winforms,visual-studio,debugging,C#,Winforms,Visual Studio,Debugging,这听起来很愚蠢,但这发生在我身上 我激活一个函数,它开始工作,完成后,它会再次启用自己。换句话说,该功能激活两次,而不是一次。我试图通过调试找出原因,但没有找到原因 当我单击面板时,此功能将激活: private void Play(object sender, EventArgs e) { Play0(MousePositionX, MousePositionY); if (swich_player == true && AI_enabled == true)

这听起来很愚蠢,但这发生在我身上

我激活一个函数,它开始工作,完成后,它会再次启用自己。换句话说,该功能激活两次,而不是一次。我试图通过调试找出原因,但没有找到原因

当我单击面板时,此功能将激活:

private void Play(object sender, EventArgs e)
{
    Play0(MousePositionX, MousePositionY);
    if (swich_player == true && AI_enabled == true)
    {
        AI_playing();
        swich_player = false;
    }
}
整个代码非常长

是我搜索不正确吗?还有其他原因吗?为了使此功能重新启动,必须有人激活它。我找不到再次激活该功能的原因

有什么建议吗,在哪里查找问题?或者问题出在哪里

编辑:


我终于找到了问题所在。有一个按钮(button1)用于更改面板的属性,还有一个按钮(button2)用于使面板宽0像素,高0像素(以便使其不可见)。第一个按钮还添加了一个激活函数的EventHandler。但是button2不会删除EventHandler。通过这种方式,函数的调用次数与我按下按钮1的次数相同。

检查您注册此函数的事件。如果您注册到某个按钮没有“OnClick”,则可能是根本原因

看起来您正在寻找的(通过您的注释/编辑)是多次调用此函数的来源。对于当前的代码片段,我们无法判断。但是您应该做的是在函数的条目上放置一个断点,然后当它被命中时,查看VisualStudio中的“调用堆栈”窗口

这可以通过调试->窗口->调用堆栈菜单项访问(运行程序时。如果不运行,它将不会显示在Windows中)

然后可以通过此窗口查看调用函数的内容。这是一个非常有用的工具

预编辑: 您的问题不是很清楚,但我认为(从变量名来看)您正在寻找一个将持续运行的游戏循环。如果是这样的话,看看哪一个有关于不同风格的游戏循环的非常好的信息。它的范围从简单到更复杂(可伸缩)的循环


你的问题是,你激活某个东西一次,它就会“再次启用”,而且“为了这个功能再次启动,必须有东西激活它。我找不到什么”。这些说法似乎相互矛盾。你能把你的问题修改得更清楚一点吗?如果编辑后我的答案不是您想要的,我会尽力添加所需的内容。

WhhhhHat?!你能更好地解释哪个函数应该由哪个函数调用吗?还是要使上面的一个递归?如果你只是想多次执行一些代码,你不需要一段时间吗?我编辑了这个问题。但我认为这对我没有帮助(但将来可能会有用)。我只是想知道为什么这个函数一次单击调用两次。代码中没有命令程序这样做的行,也没有再次调用函数的行。我现在理解得更好了,我没有从最初的问题中领会到这一点。您是否调试并使用“调用堆栈”窗口来确定每个调用的来源?没有。我甚至不知道这个存在。谢谢没问题,祝你好运。我编辑了我的答案,如果您需要的话,可以提供更多的帮助来查找此窗口。我不会用bool标志/计数器编辑你的函数,以防止它多次运行,相反,你应该使用Visual Studio的此功能来查找你不期望的调用它的内容,并将其删除。太好了,希望我们有所帮助。顺便说一下,大多数控件不需要手动将宽度/高度设置为0来隐藏它们。Look into Visibility=Visibility.Collapsed可为您执行此操作。在“按钮属性”窗格上,检查编写函数的事件。它应该是OnClick事件