Ton*_*ile 5 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();
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都有效,但问题是它并不总是有效。我的猜测是,在某些系统上,第一个实例及其RemoteService
创建的实例尚未终止,这会导致调用 to 启动的进程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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果以编程方式重新启动,获取此代码以允许启动新实例的正确方法是什么?我应该添加一个bool
标志Restarting
并在for
循环中等待调用SingleInstance<App>.InitializeAsFirstInstance
返回 true 吗?或者,还有更好的方法?
要做的一件事是,当您调用 Process.Start 时,将参数传递给可执行文件,告诉它这是“内部重启”情况。然后进程可以通过等待更长的时间让进程退出来处理这个问题。你甚至可以告诉它 ProcessID 或其他东西,这样它就知道要注意什么。
归档时间: |
|
查看次数: |
3484 次 |
最近记录: |