首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跨IPC的C#事件

跨IPC的C#事件
EN

Stack Overflow用户
提问于 2011-02-09 06:23:48
回答 2查看 1.5K关注 0票数 1

好吧,长话短说,我有一个Windows服务,它处理Win32_VolumeChangeEvent,并将U盘设备的到达记录到事件日志和SQL数据库中。一个额外的组件,这是一个隐藏的UI (WinForms),加载在用户会话在登录-这弹出一个消息框,提醒用户的公司政策有关U盘等AFAIK,这是最好的方式去,因为服务不能再在交互模式下运行。

不管谁..。在架构上,这个小东西的v1与处理设备插入的WndProc消息的UI组件一起运行,然后通过IPC (命名管道)将设备标识符传递给服务,该服务将处理WMI方法/ EventLog写入(因为并不是所有的用户都具有本地管理权限)。这有一个缺点,那就是UI元素被进程终止,并且不再检测设备插入。

因此,当前的版本是服务处理Win32_VolumeChangeEvents并从设备获取所需的详细信息,然后记录到EventLog和SQL。一切都很出色,而且工作得很完美。除了现在我想知道触发UI显示弹出窗口的最好方法是什么。

我在Google周围和这里研究过,寻找关于IPC上的事件的想法,这样我就可以从UI组件订阅事件并在服务中触发它,但我没有发现太多有用的东西。我还受到.net2的限制,所以WCF不在考虑范围之内(如果你想这样做,我不怕p/invoke )。

所以。你会怎么做?链接,想法,漫游,伪代码,实际代码...一切都很感谢。我正在努力坚持我认为的最佳实践,尽管我也认为编程是一种艺术形式,我的最佳实践可能是别人的恐怖故事。

所以--你会怎么做?如果我需要澄清,请告诉我:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-09 08:27:52

回到Windows API编程的糟糕年代,我们有时会使用RegisterWindowMessage来注册一个唯一的消息ID,(大概)只有我们的窗口知道如何处理它。然后,我们可以从另一个应用程序中触发该窗口,方法是使用HWND_BROADCAST的窗口句柄调用PostMessagemsg参数就是那个唯一的消息值。如果您希望在进程之间共享的所有内容都可以包含在两个DWORD值(wparamlparam)中,那么这种方法非常有用。如果您分配全局内存并将引用作为参数之一传递,则可以共享更多数据。

当然,调用PostMessage是没有问题的。至于在UI代码中处理消息,您必须覆盖窗体的WndProc。有关示例,请参阅How do I send/receive windows messages between VB6 and c#?

您可以对命名事件执行某些操作,尽管这只会通知UI发生了某些更改。它实际上不会告诉你发生了什么。我想,如果只有一小部分可能的事件,你可能会有多个事件,但这很快就会变得复杂起来。

您可以使用命名事件路由并使用共享内存(内存映射文件)来共享状态。

或者,您可以设置套接字、命名管道、TcpListener/TcpClient,甚至UdpClient。所有这些都应该工作,具有不同程度的复杂性和/或可靠性。

票数 3
EN

Stack Overflow用户

发布于 2011-02-09 06:31:57

我唯一想到的想法是让一个服务定期检查UI应用程序的状态,如果它被终止了,就重新启动它。似乎没有一个标准模块可以在用户会话中运行,并让服务向该模块发送通知。存在第三方解决方案,但它们可能会被终止(并不是说应该安装它们才能使用)。

更新:重读这个问题后,我认为可能你的用户界面没有接收到windows消息,所以你需要另一种机制。为什么不在服务中创建一个Semaphore同步对象,并在UI进程中等待它(在单独的线程中)?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4939217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档