Windows服务和桌面应用程序之间的通信

19

我知道之前有类似的问题,但即使我在谷歌上搜索了很久仍然完全没有头绪。

我编写了一个小型的Windows服务,它在后台线程中执行我的主要应用程序以前执行的操作(基于几个原因,将其移动到单独的服务中是有意义的)。

当后台线程作为我的应用程序的一部分运行时,每次完成工作(在这种情况下是更新数据库)时,它都会触发一个事件,我会使用该事件的时间戳来获取适当的信息以更新窗口。 我认为具体细节并不相关,但如果需要更多细节,请告诉我。

现在,既然已经将填充数据库的任务作为服务运行,那么问题就变成了:如何替换以前由事件完成的任务?

换句话说,将一个基本的DateTime从我的服务传递到我的应用程序的最简单和/或最有效的方法是什么?

我以前从未进行过任何IPC,但开始阅读并彻底混淆了它。 到目前为止,命名管道似乎是我最好的选择,但我无法找到任何帮助我理解其功能的东西... 我找到的所有东西都是注释贫乏的代码块或“教程”,它们比我需要的深入得多,而且没有清楚地涵盖基础知识。

因此,在没有建立良好基础的情况下,我有点困惑。 实现执行以前我的事件完成的任务的最佳方法是什么,我在哪里可以学习该方法的基础知识?

编辑:

像往常一样,这里的每个人都非常出色,感谢所有快速的响应。 Gerrie的链接正是我所需要的(尽管当时我不知道我需要什么)。


1
命名管道相当低级,为什么不使用WCF? - David Heffernan
您可以创建一个内存映射文件,让您的服务将数据写入其中,并由您的应用程序读取。这很容易实现。 - Alex
1
@Alex,这是否意味着不断检查文件是否已更新?这似乎是一个没有必要的额外步骤(除非我漏掉了什么)。 - Kyle G.
内存映射文件是一个不可取的方法。不要考虑它。 - David Heffernan
关于WCF,有数百万个教程可供选择。 - David Heffernan
显示剩余3条评论
2个回答

8
不要被命名管道这个概念吓到,WCF会帮你处理繁琐的部分。你只需要配置它,它就成为了另一个通信渠道,可以替代HTTP等。因此,你需要深入了解WCF。请看这篇教程

当我第一次创建我的服务时,我选择了“Windows服务”模板而不是“WCF窗口服务”模板......这会有什么区别吗?重头开始使用WCF模板会让生活更轻松吗? - Kyle G.
基本上,您可以将WCF作为服务的一部分侦听端口,然后让应用程序在某个事件(例如用户单击按钮)时ping该端口。这个教程对我非常有帮助。http://www.codeproject.com/Tips/497123/How-to-make-REST-requests-with-Csharp - Rob
我现在和原帖作者处于同样的位置,但是 tech.pro 的链接已经失效了。有人有另外一个好的链接或者这篇文章的备份吗? - GuidoG
Gaaa。链接已经失效了。有更新的可能吗? - BanksySan
非常棒的教程。感谢您提到它! - Cosmin Ioniță

4

换句话说,从我的服务到我的应用程序,传递一个基本的DateTime,最简单/最有效的方法是什么?

在这种情况下,您应该使用命名管道,尽管您拥有的其他选项包括MSMQ,webservices。


1
你具体指的是哪些“其他选项”? - Kyle G.
@KyleG。我在我的答案中也提到了这些。MSMQ和Web服务。 - Ehsan
1
哦,抱歉,我完全读错了。咖啡因还没有刺激我的大脑 :) - Kyle G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接