6

我正在编写一个将进行大量网络通信的 Windows 服务,并且我需要一种方法来通知用户(如果已登录)任何异常/错误。我知道允许服务与桌面交互是不好的做法,那么是否有另一种方法来通知用户发生了错误?我知道事件记录,但我也希望能够显示系统托盘中的通知气泡或引起用户注意的东西。

4

6 回答 6

7

请考虑使用事件日志和单独的应用程序仅用于监控。您也可以考虑使用电子邮件或 MSMQ。

于 2009-12-11T16:25:51.470 回答
5

通常,您将拥有服务可以通知的辅助应用程序。例如,您可以有一个系统托盘图标 (ugh),它会在发生重要事情时弹出气球 (double ugh)。然后,应用程序本身也可以为您的服务提供设置界面。

于 2009-12-11T16:21:36.017 回答
4

使用另一个应用程序与此应用程序交互并通知用户错误怎么样?这样您就可以为用户提供“选项”。可能是关闭警报、电子邮件等

于 2009-12-11T16:19:12.917 回答
3

您可以使用一些现有的通知应用程序,例如 Growl:http ://www.growlforwindows.com/gfw/ 。这将允许用户“选择加入”。

于 2009-12-11T16:25:52.093 回答
2

您必须提供“与桌面交互”选项的替代方案。Vista 和 Win7 不再支持它。授予受限用户对在高特权帐户上运行的 UI 的访问权限被认为存在太大的安全风险。谷歌“会话 0 隔离”以查找有关此的详细信息。

您需要使用 .NET 支持的一种进程互操作机制来设置您的服务和 UI 应用程序之间的交互。对于简单的消息传递,请使用套接字或命名管道。管道名称需要具有“全局\”前缀才能对所有会话可见。对于更复杂的交互,您可以使用 Remoting 或 WCF。

请务必处理用户决定不运行或终止桌面应用程序的可能性。您应该使用 EventLog 类记录任何错误。

于 2009-12-11T17:15:00.657 回答
1

为了解决这个问题,我创建了一个用户可以随意启动和停止的 Windows 窗体应用程序。当然,Windows 服务在后台 24/7 全天候运行。当应用程序启动时,它使用 Windows Communication Foundation (WCF) 来查询服务的当前状态——它是否处于活动状态、连接了多少客户端、收集了多少字节等。然后将此信息呈现给用户应用程序内部。

我试图模仿任务管理器的行为,所以我还在System.Windows.Forms.NotifyIcon应用程序的主窗体中添加了一个,它在系统托盘中显示一个图标。当应用程序打开时,会显示系统托盘图标。用户可以将应用程序最小化到任务栏或完全隐藏应用程序。托盘图标仅在用户关闭应用程序时消失。托盘图标还支持双击重新打开应用程序和快速访问功能的弹出菜单。

无论如何,我想说的是,WCF 是让您的服务和前端应用程序进行通信的最直接的方式。人们会争论与 WCF 相关的所谓“陡峭”学习曲线,但我没有经历过。我发现 WCF 是开发进程间通信的一种非常有效的方式。您可以观看此视频,让您对 WCF 编程范式有所了解。

于 2009-12-11T20:06:29.737 回答