如何以编程方式重新启动单实例应用程序

时间:2012-12-14 20:28:39

标签: wpf restart single-instance

我的WPF程序使用SingleInstance.cs来确保如果用户尝试通过双击快捷方式或其他某种机制来重新启动它,则只运行它的一个实例。但是,我的程序中存在需要重新启动的情况。这是我用来执行重启的代码:

App.Current.Exit += delegate( object s, ExitEventArgs args ) {
    if ( !string.IsNullOrEmpty( App.ResourceAssembly.Location ) ) {
        Process.Start( App.ResourceAssembly.Location );
    }
};

// Shut down this application.
App.Current.Shutdown();

这大部分时间都有效,但问题是它并不总是有效。我的猜测是,在某些系统上,第一个实例和它创建的RemoteService尚未终止,这导致通过调用Process.Start( App.ResourceAssembly.Location );启动的进程终止。

这是我的app.xaml.cs中的Main方法:

[STAThread]
public static void Main() {
    bool isFirstInstance = false;

    for ( int i = 1; i <= MAXTRIES; i++ ) {
        try {
            isFirstInstance = SingleInstance<App>.InitializeAsFirstInstance( Unique );
            break;

        } catch ( RemotingException ) {
            break;

        } catch ( Exception ) {
            if ( i == MAXTRIES )
                return;
        }
    }    

    if ( isFirstInstance ) {
        SplashScreen splashScreen = new SplashScreen( "splashmph900.png" );
        splashScreen.Show( true );

        var application = new App();
        application.InitializeComponent();
        application.Run();

        SingleInstance<App>.Cleanup();
    }
}

如果正在以编程方式重新启动新代码,那么获取此代码的正确方法是什么?我应该添加bool标记Restarting并在for循环中等待SingleInstance<App>.InitializeAsFirstInstance的调用返回true吗?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

要做的一件事是,当您调用Process.Start时,将参数传递给可执行文件,告诉它它是“内部重启”情况。然后,该进程可以通过等待更长的时间来处理该进程以退出该进程。你甚至可以告诉它ProcessID或其他东西,所以它知道要注意什么。