我们在Windows XP Box上运行浏览器应用程序中的Silverlight。偶尔,这个应用程序挂起,必须关闭。当我们在这种情况下尝试重新启动应用程序时,应用程序将以奇怪的状态启动。我们查看TaskManager并查看sllauncher.exe的多个实例正在运行。解决方案是终止sllauncher.exe实例并再次启动应用程序(当然,真正的解决方案是处理导致应用程序首先挂起的问题......)。
我想做的是,启动我们的silverlight应用程序,检测是否有多个sllauncher.exe实例正在运行,并向用户显示一条消息,指出应采取的纠正措施。我的浏览器Silverlight应用程序可以访问正在运行的进程列表吗?
答案 0 :(得分:1)
这就是我们这样做的方式......
我们创建了一个消息接收器。如果我们无法使用相同的密钥进行监听,那么我们假设另一个实例正在运行。然后我们询问用户他/她是想要杀死当前实例还是已经运行的实例。在收到的消息事件处理程序中,如果有消息进入,我们会终止窗口。这不是最优雅的解决方案,但它有效。最重要的是提请注意不止一个实例正在运行的事实。
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);
}
答案 1 :(得分:0)
很有可能,你也可以在P / Invoke中使用TerminateProcess杀死它们 - 只要你有提升的权限。
我正在开发一种标牌解决方案(长时间运行的远程控制视频播放器),最近我遇到了一个非常类似的问题。由于我的崩溃是非常罕见的,我没有得到任何记录,我也决定采取“只是重新启动它”的方式来缓解问题。
但是,我的做法略有不同,因为我从嵌入在xap中的silverlight运行本机(WPF)卫星应用程序。由于它是由silverlight播放器启动的,因此它可以在启动时将进程id作为参数。然后它与Silverlight播放器进行了长时间的聊天(通过http,端口也在启动时提供),如果Silverlight合作伙伴突然静音,它会重新启动它。
首先尝试关闭主窗口完成重启,如果在等待一段时间后不能正常工作,它就会被杀死。
由于卫星是.NET,我不需要任何P / Invoke用于该逻辑。
如果您想纯粹在Silverlight中执行此操作,请查看the interop wiki。
对于进程列表,kernel32.dll中的GetConsoleProcessList听起来很有希望。代码片段在WPF和Silverlight中都有效。