1

我们在 Windows XP Box 上运行 Silverlight 浏览器应用程序。有时,此应用程序会挂起并且必须关闭。当我们在这种情况后尝试重新启动应用程序时,应用程序以一种奇怪的状态启动。我们查看 TaskManager 并看到多个 sllauncher.exe 实例正在运行。解决方案是终止 sllauncher.exe 实例并重新启动应用程序(当然,真正的解决方案是首先处理导致应用程序挂起的问题......)。

我想做的是,在我们的 silverlight 应用程序启动时,检测 sllauncher.exe 的多个实例是否正在运行并向用户显示一条消息,指示应该采取哪些纠正措施。我的浏览器之外的 silverlight 应用程序可以访问正在运行的进程列表吗?

4

2 回答 2

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);
}
于 2014-06-30T15:34:16.130 回答
0

很有可能,你也可以在 P/Invoke 中使用 TerminateProcess 杀死它们——只要你有提升的权限。

我正在开发一个标牌解决方案(一个长时间运行的远程控制视频播放器),最近我遇到了一个非常相似的问题。由于我的崩溃非常罕见并且我没有任何日志记录,因此我也决定采用“只需重新启动”的方式来缓解问题。

但是,我的做法稍有不同,因为我从嵌入 xap 的 silverlight 运行本机 (WPF) 卫星应用程序。由于它是由silverlight播放器启动的,它可以在启动时获取进程id作为参数。然后它与 silverlight 播放器进行了长时间的聊天(通过 http,端口也在启动时提供),如果 silverlight 伙伴突然沉默,它会重新启动它。

重新启动是通过首先尝试关闭主窗口来完成的,如果在短暂的等待期后这不起作用,它就会被杀死。

由于卫星是 .NET,因此我不需要任何 P/Invoke 来实现该逻辑。

如果您想纯粹在 Silverlight 中执行此操作,请查看 interop wiki

对于 kernel32.dll 中的进程列表 GetConsoleProcessList 听起来很有希望。代码片段在 WPF 和 Silverlight 中同样有效。

于 2013-11-26T13:49:34.707 回答