例如:创建一个新的Windows.Forms项目并给它一个按钮。添加以下代码:

protected override void OnDeactivate(EventArgs e)
{
    base.OnDeactivate(e);
    Debug.WriteLine("deactivated");
}

private void button1_Click(object sender, EventArgs e)
{
    Debug.WriteLine("hello");
}


如预期的那样,单击该按钮时,输出窗口显示“ hello”,而激活其他窗口时,显示“ deactivated”。

现在,在Debug.Writeline(“ hello”)上放置一个断点。单击按钮,然后恢复执行。请注意,输出窗口同时显示“ hello”和“ deactivated”。

我想找到一种方法来防止这种情况的发生,以便调试我的应用程序不会改变其行为,没有必要做更多的事情。就像不存在断点时一样,单击处理程序应该运行,但是停用处理程序应该不运行。

理想的是在Visual Studio中找到一个设置,以使其达到断点不会触发应用程序中的停用事件。我没有找到这样的设置。

找到一种方法来知道代替我的被激活的应用程序是Visual Studio,这是可以接受的(更好的是:它是一些调试工具...该程序很可能使用Visual Studio Code或Mono Develop进行调试)。然后,我可以对OnDeactivate进行编码,以免发生这种情况下的停用行为。

可以在断点上设置一个动作,该断点将在程序中设置一个阻止该动作的标志。这是一个非常不理想的解决方案,因为每个程序员都必须记住,每次创建不需要停用动作的断点时,都要这样做。

远程调试是另一个潜在的解决方案。但我不想使用其他系统进行所有调试。

(注意:在实际应用中,停用时发生的事情是保存用户正在编辑的内容。问题是,当我正在调试其他内容时,意外的Save可能会使事情搞砸。数据可能不在保存的有效状态。)

最佳答案

您已经说过:“远程调试是另一个潜在的解决方案;但是我不想使用其他系统来进行所有调试。” (我猜这也排除了使用VM)。

我的建议是减少编写单元测试对正在运行的应用程序进行调试的依赖。使用单元测试,您可以独立于系统的其他部分来测试系统。

有了单元测试后,就可以在“调试”下运行每个单独的测试,从而使您可以完全像调试应用程序时一样逐步遍历代码。但是由于您要定义测试的范围,因此整个应用程序都无法运行,因此可以将应用程序失去焦点之类的事情排除在范围之外。

一旦测试到位,它可以缩短代码+调试迭代周期所花费的时间,从而提高工作效率。之所以能够实现这一目标,是因为该测试将您直接触发到已经设置了测试场景的相关代码中,而不是整个应用程序都必须启动,并且您每次都导航至相关部分以进入所需的场景。

这些测试(如果编写正确的方式)的另一个好处是,您可以使它们作为自动构建的一部分运行,只要有人更改某些代码,该构建就会触发。这意味着,如果有人破坏了该代码,则测试将失败,并且构建也将失败。

关于c# - 遇到断点时,如何防止Windows.Forms OnDeactivate中的代码运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51598678/

10-17 01:11