问题:共享内存在Windows服务和普通进程之间无法工作
我的项目中有一个后台服务,开机自启动,然后会去服务器上获取大数据,缓存在自己的地址空间中。
另外一个进程(Windows Form界面)启动之后会来这个服务这里获取这些数据。
开始为了方便开发调试,我的后台服务并没有做成服务,开发时候就是一个直接的进程,称为进程A。
启动之后从服务器端获取大数据,然后通过共享内存的方式传递给进程B(即那个Windows form界面)。
我采用共享内存方式,因为要说到效率首先就想到共享内存,C#中共享内存的方法封装在MemoryMappedFile类中,CreateNew()创建共享内存,OpenExsisting()打开已有的共享内存来访问。
开发的时候,进程A以进程的方式运行,我的这个流程工作没有任何问题。
但是今天部署的时候,将进程A安装位Windows服务之后,共享内存就无论如何也不能工作了。
要么是找不到指定文件,要么就是什么错误也没有,但是什么也读不到。。。。
我在网上查了一下,貌似是说WIndows7下面 WIndows服务和进程是不能采用共享内存来进行数据传输的,而WIndows XP可以。。。 (我怎么觉得很不合理呢???)
引用网络上的一个帖子的回复:
=========================================================================
从vista以后的版本都测试不通过,winXp和win2003测试通过。 好像是为了安全性吧
=================================================================
另外我想说的是,Windows服务和普通进程,以及WinForm这些之间都是可以采用命名管道来进行通信的。
消息队列也可以用于WIndows服务和普通进程之间的通信,只是创建队列的时候需要设置队列的权限,参见这里。
这个问题亟需解决!!!
解决方法:命名管道
根据i命名管道的读写方法write(char[] buffer, int offset, int count),可以知道命名管道一次可以发送的数据量大小是int.MAXVALUE,就是2^31 = 2G。
所以一般来说同一个机器之间的大数据传输需求可以满足,下面是我的代码:
(一)这是WIndows服务中的一个线程,开启一个命名管道,等待获取大数据的请求:
(二)这是普通进程(window form)的代码,连接到命名管道,请求接收数据:
下面两个是用的到两个序列化的方法: