C# Silverlight检测正在运行的sllauncher.exe
我们正在Windows XP设备上运行Silverlight浏览器外应用程序。偶尔,此应用程序会挂起并必须关闭。当我们在这种情况下尝试重新启动应用程序时,应用程序会以一种奇怪的状态启动。我们在TaskManager中看到多个sllauncher.exe实例正在运行。解决方案是终止sllauncher.exe实例并再次启动应用程序(当然,真正的解决方案是处理导致应用程序挂起的问题…)C# Silverlight检测正在运行的sllauncher.exe,c#,silverlight,C#,Silverlight,我们正在Windows XP设备上运行Silverlight浏览器外应用程序。偶尔,此应用程序会挂起并必须关闭。当我们在这种情况下尝试重新启动应用程序时,应用程序会以一种奇怪的状态启动。我们在TaskManager中看到多个sllauncher.exe实例正在运行。解决方案是终止sllauncher.exe实例并再次启动应用程序(当然,真正的解决方案是处理导致应用程序挂起的问题…) 我想做的是,在启动我们的silverlight应用程序时,检测sllauncher.exe的多个实例是否正在运行,
我想做的是,在启动我们的silverlight应用程序时,检测sllauncher.exe的多个实例是否正在运行,并向用户显示一条消息,指示应采取的纠正措施。我的浏览器外silverlight应用程序可以访问正在运行的进程列表吗?很有可能,您也可以通过p/Invoke中的TerminateProcess杀死它们,只要您拥有提升的权限 我正在开发一个看板解决方案(一个长期运行的远程控制视频播放器),最近我遇到了一个非常类似的问题。由于我的崩溃非常罕见,而且我没有任何日志记录,我也决定采用“重新启动”的方式来缓解问题 不过,我的做法略有不同,因为我从silverlight运行了一个本机(WPF)卫星应用程序,该应用程序嵌入到xap中。由于它是由silverlight player启动的,因此它可以在启动时获取进程id作为参数。然后,它与silverlight player进行长时间的聊天(通过http,启动时也会提供端口),如果silverlight合作伙伴突然沉默,它会重新启动它 重新启动是通过首先尝试关闭主窗口来完成的,如果在短时间等待后仍不起作用,它将被终止 因为卫星是.NET,所以我不需要任何p/Invoke来实现该逻辑 如果你想完全在Silverlight中进行,请看一看
对于进程列表,kernel32.dll中的GetConsoleProcessList听起来不错。这些代码片段在WPF和Silverlight中都可以工作。很可能,并且您也可以在p/Invoke中使用TerminateProcess杀死它们,只要您拥有提升的权限 我正在开发一个看板解决方案(一个长期运行的远程控制视频播放器),最近我遇到了一个非常类似的问题。由于我的崩溃非常罕见,而且我没有任何日志记录,我也决定采用“重新启动”的方式来缓解问题 不过,我的做法略有不同,因为我从silverlight运行了一个本机(WPF)卫星应用程序,该应用程序嵌入到xap中。由于它是由silverlight player启动的,因此它可以在启动时获取进程id作为参数。然后,它与silverlight player进行长时间的聊天(通过http,启动时也会提供端口),如果silverlight合作伙伴突然沉默,它会重新启动它 重新启动是通过首先尝试关闭主窗口来完成的,如果在短时间等待后仍不起作用,它将被终止 因为卫星是.NET,所以我不需要任何p/Invoke来实现该逻辑 如果你想完全在Silverlight中进行,请看一看
对于进程列表,kernel32.dll中的GetConsoleProcessList听起来不错。这些代码片段在WPF和Silverlight中都可以使用。我们就是这样做的 我们创建了一个消息接收器。如果我们无法使用相同的密钥侦听,那么我们假设另一个实例正在运行。然后我们询问用户他/她是想杀死当前实例还是已经在运行的实例。在received message事件处理程序中,如果消息传入,我们将关闭窗口。这不是最优雅的解决方案,但它确实有效。最重要的是要提请注意多个实例正在运行这一事实
try
{
LocalMessageReceiver receiver = new LocalMessageReceiver("There can be only one");
receiver.Listen();
receiver.MessageReceived += receiver_MessageReceived;
}
catch (ListenFailedException)
{
log.Info("Another instance is running.");
// Display message, take corrective action etc.
interactionService.ShowMessage(Strings.OneInstanceAllowed,
Strings.ApplicationName, DialogButton.OKCancel, DialogImage.Question,
OnCloseClientResponse);
}
我们就是这样做的 我们创建了一个消息接收器。如果我们无法使用相同的密钥侦听,那么我们假设另一个实例正在运行。然后我们询问用户他/她是想杀死当前实例还是已经在运行的实例。在received message事件处理程序中,如果消息传入,我们将关闭窗口。这不是最优雅的解决方案,但它确实有效。最重要的是要提请注意多个实例正在运行这一事实
try
{
LocalMessageReceiver receiver = new LocalMessageReceiver("There can be only one");
receiver.Listen();
receiver.MessageReceived += receiver_MessageReceived;
}
catch (ListenFailedException)
{
log.Info("Another instance is running.");
// Display message, take corrective action etc.
interactionService.ShowMessage(Strings.OneInstanceAllowed,
Strings.ApplicationName, DialogButton.OKCancel, DialogImage.Question,
OnCloseClientResponse);
}
此外,如果你考虑下我的路线,给我一封邮件,我给你发送一些代码。此外,如果你考虑下我的路线,给我一封邮件,我给你发送一些代码。