【问题标题】:Is Application.Restart bad?Application.Restart 不好吗?
【发布时间】:2026-01-14 09:00:02
【问题描述】:

我有一个 .Net windows 窗体应用程序,其中在 Main_Load 事件中初始化了很多变量,我有一种情况,我希望重新查询我的数据库并将所有变量设置为 null 并重新初始化(基本上是表单从一开始就 100% 重新加载),但我编写 Main-Load 的方式(我的错)并不那么容易......

我知道我可以完全通过简单地调用Application.Restart 得到我想要的东西,并且它可以做到漂亮,但我不确定这是否是一个好的编程练习或被认为非常糟糕。

在这种情况下使用Application.Restart 可能会遇到什么问题吗?

【问题讨论】:

  • 您不能将 Main_Load 中的代码抽象为一个单独的函数,并在需要时调用它吗?这样您就不必担心任何不属于您的功能的副作用。
  • 我认为您可能遇到的最大问题是当您的同事看到您的代码并说 WTF 时?!
  • ...太晚了,费尔南多...他们一直都这么说:p

标签: c# .net vb.net winforms


【解决方案1】:

我遇到了这个问题。

当用户注销时,我确实需要重新启动大型 Winforms 应用程序,以确保清除所有缓存的(我的)数据。

通过将 Application.restart() 添加到 Application Shutdown Event 中解决了我的问题。

这适用于 VS 环境和运行 EXE 时

如果您想查找该事件,请选择您的主要项目属性,然后从应用程序(侧选项卡)中选择底部的查看应用程序事件。

我的猜测是这行得通,因为它在关闭过程中已经很晚了。希望这对某人有所帮助,更重要的是,它会继续有效。

【讨论】:

    【解决方案2】:

    要直接回答标题中的问题,是的,重新启动应用程序以重新初始化变量是不好的做法。

    在某些情况下重新启动应用程序很有用(例如自我更新),但在我看来重新启动以模仿 ReInitialize() 方法是不好的。

    【讨论】:

    • ...如果我对您的理解正确,我基本上是在自我更新...我的挑战是我的主要表单中有几十个列表对象,我将它们调暗为 Dim xyz作为新列表(ABC)然后,在我的 main_load 事件和整个程序中,我将添加到带有数据库数据的列表中,现在我需要一个新的查询来填充它们......恐怕我'如果我尝试将它们全部清空,我会错过一个......
    【解决方案3】:

    对调试不友好,但实际上并没有什么问题。这与终止应用程序并重新启动它完全相同。

    您可以通过简单地创建主窗体的新实例并关闭旧实例来避免这种情况。但是,这确实需要您阻止程序退出。代码is here

    【讨论】:

    • 保修物有所值。
    • @HansPassant 换句话说:“我不知道”? ;-)
    • 如果您想了解某件事是否对您有害,那么您应该咨询您的医生。相反,他会告诉你多运动,多吃蔬菜。我发布了一个体面练习的链接。
    【解决方案4】:

    不是方法不行;相反,很多时候程序员忘记了他们在自己的代码中添加了一些东西来阻止应用程序自动关闭或启动。

    请关注Thread

    你也可以用

     System.Diagnostics.Process.Start(Application.ExecutablePath);
     Application.Exit();
    

    【讨论】:

    • ... 这两种方法让我害怕的部分是我在 Main.Load 事件中设置了一个断点,但它第二次没有触发...我猜这是一个.Net 中的调试器存在问题,但它肯定让我对这种方法保持警惕......它很糟糕吗??
    • 这还不错,因为它也已在线程中讨论过。只是不靠谱