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)的代码,连接到命名管道,请求接收数据:
下面两个是用的到两个序列化的方法:
我的项目中有一个后台服务,开机自启动,然后会去服务器上获取大数据,缓存在自己的地址空间中。
另外一个进程(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)的代码,连接到命名管道,请求接收数据:
下面两个是用的到两个序列化的方法:
相关文章推荐
- nginx proxy_buffer_size 解决后端服务传输数据过多,其实是header过大的问题
- AngularJs之$http服务前端与后端之间的数据传输
- 2个进程之间数据的同步问题
- 基于xposed实现android注册系统服务,解决跨进程共享数据问题
- 关于Bundle和Intent在两个activity之间传输数据的问题
- nginx proxy_buffer_size 解决后端服务传输数据过多,其实是header过大的问题
- sql sever 2014 和 navicat 工具之间 sql server导出数据 sql文件 数据传输问题
- 关于webrtc中使用DataChannelInterface进行普通数据的传输的若干问题。
- 进程之间如何通过消息队列传输大量数据
- TCP与UDP传输数据量问题
- Activity之间传递大数据问题
- TCP传输小数据包效率问题
- 名企笔试:2016 Google 在线评测题(数据传输问题)
- SCPPO(五):解决MVC中Json传输数据量问题
- html 之间如何通过URL传输参数,并解决中文乱码问题
- 谈谈 webservice -- axis2框架的使用,JSON数据的传输问题
- Java NIO系列教程(五) 通道之间的数据传输
- android Activity和Fragment之间的数据传输的实现
- mina自定义编解码器接收处理byte数组(同时解决数据传输中的粘包、缺包问题)
- 蓝牙主机和从机之间传输数据说明