【问题标题】:Check for Application.Restart()检查 Application.Restart()
【发布时间】:2018-06-08 16:17:49
【问题描述】:

是否可以执行以下操作:

bool wasRestarted = ???;
main() {
    if(wasRestarted) {
        MessageBox.Show("Welcome Back John");
    }
    Application.Restart();
}

这专门针对 Application.Restart 而不是软关闭和重新打开。

我现在唯一能想到的方法是创建一个设置值:

  • 类型:int
  • 默认值:0

重启前设置为1,然后检查是否为1。

一定有比这更好的方法吗?

选择的答案非常完美!像往常一样,感谢社区为我带来了一个新功能:P

我用它来解决在另一个线程上的 Application.Restart 上释放 Mutex 的方法。由于互斥锁是线程锁定的,因此在重新启动之前我无法在登录功能上释放互斥锁,导致重新启动返回锁定的互斥锁并且无法继续。有了这个,我可以知道它是否重新启动,然后延迟一段时间,直到第一个“应用程序”实际关闭并且程序的 Main() 过早关闭,导致互斥体被清除。然后 while() 将继续,现在我的应用程序可以正常工作了!

显然根据我的需要,这不是最理想的结果,但它确实有效,这就是我所能要求的。

【问题讨论】:

  • 这是什么项目? WPF、WinForms、控制台或其他?
  • @Mike WinForms.
  • 我认为如果你这样做,变量会被重置。
  • @BugFinder 我基本上想要它,首先启动布尔值总是错误的。然后,一旦我 application.restart() 它会在关闭并重新打开后将其 bool 设置为 true。

标签: c# winforms


【解决方案1】:

您可以为此使用临时环境变量:

// Set environment variable before calling Restart
Environment.SetEnvironmentVariable("MYAPP_RESTART", "1");
Application.Restart();

// Detect restart:
var wasRestarted = Environment.GetEnvironmentVariable("MYAPP_RESTART");

if (wasRestarted == "1")
{
    // Your app was restarted
    Environment.SetEnvironmentVariable("MYAPP_RESTART", "0");
}

【讨论】:

  • 哇哦,新东西!旧操作系统是否存在不兼容问题?我需要支持 7、8、8.1、10、Server 2008 R2 及更高版本。 (Vista 已经不受支持)。
  • 我不这么认为,环境变量从 DOS 开始就存在 :)
  • 完美!像魅力一样工作。
  • 使用这个或配置文件或设置有什么区别?它只是另一个写你的价值的地方,其余的都是一样的还是我错过了什么?
  • @WouterHuysentruit 是的,这是使用这种方法的更好理由
【解决方案2】:

您有权访问文件系统吗?如果是这样,请编写一个保存退出状态的配置文件。如果正常退出另存为(比如说)0,重新启动时另存为1,然后在启动时读取此文件。第一次启动时,此文件可能不存在(除非它是您的安装程序的一部分),因此如果不存在则假定为 0。

如果您使用的是 Windows,您也可以使用注册表设置。不难。

【讨论】:

  • 这与我之前提到的设置基本相同。
  • 此解决方案(文件或注册表)的问题是同一应用程序的多个实例可能会相互干扰。
  • @Wouter 是正确的,如果是这种情况,用户还必须处理一个问题。看到有人运行 GUI 程序的多个实例,值得欢迎有人重新启动,这会很有趣:)
【解决方案3】:

当你重新启动它时,你可以将一个(命令行类似的)参数传递给 main。默认为 0,因此默认情况下您不显示欢迎返回框。

重启前如何更改参数,请查看Modify command line arguments before Application.Restart()

【讨论】:

  • .Application.Restart 支持这样的东西吗?
  • Restart 将使用与第一次启动完全相同的命令行参数重新启动应用程序。见msdn.microsoft.com/en-us/library/…
  • 查看the source code of Application.Restart 并推出您自己的带有附加参数的版本。
  • @WouterHuysentruit 从来不知道,谢谢,不幸的是这对我的情况没有帮助:(除非我可以在加载后编辑参数并且它会看到更改?或者它会忽略它们
  • @UweKeim 哦,哇,方便的参考页面,我稍后会为 TcpClient 研究它! :D
【解决方案4】:

如果是关于重新启动应用程序,则不需要存储设置。

如果不是关于重启,而是关于下次用户打开应用程序的时间,那么你肯定需要存储一个设置。

在此答案中,我将分享“欢迎回来!”的解决方案。用户,在重新启动应用程序后。这样做。在下面的示例中,使用Application.Restart 的源代码,我为Program 类实现了Restart 方法,并传递了一个显示应用程序已重新启动的命令行参数:

要使用,拨打Program.Restart()即可。

static class Program
{
    private static string restartArg =  "-restart";
    public static void Restart()
    {
        var startInfo = System.Diagnostics.Process.GetCurrentProcess().StartInfo;
        startInfo.FileName = Application.ExecutablePath;
        var exit = typeof(Application).GetMethod("ExitInternal",
                            System.Reflection.BindingFlags.NonPublic |
                            System.Reflection.BindingFlags.Static);
        exit.Invoke(null, null);
        startInfo.Arguments = restartArg;
        System.Diagnostics.Process.Start(startInfo);
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var restarted = Environment.CommandLine.Contains(restartArg);
        if (restarted)
            MessageBox.Show("Welcome back!");
        Application.Run(new Form1());
    }
}

如果您喜欢使用原始命令行参数并对其进行操作而不是消除它,请查看这篇文章:

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2013-12-12
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多