您的位置:首页 > 大数据

WIndows NT服务和普通进程之间大数据传输问题

2013-09-23 22:01 337 查看
问题:共享内存在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)的代码,连接到命名管道,请求接收数据:



下面两个是用的到两个序列化的方法:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: