首页 新闻 会员 周边

如何获取windows服务中提供的数据?

0
悬赏园豆:20 [已解决问题] 解决于 2015-04-23 20:55

C/S架构,winform如何获取windows服务中提供的数据?

详细描述:windows服务定期从WCF服务上获取数据,并使用某种方式将这些获取的数据“缓存”起来,响应winform客户端访问请求。

winform客户端原先从WCF上获取数据,但由于数据量大从WCF服务上获取数据耗费时间较长,而且对于一些基础数据,并无可能修改。现在想通过windows服务的方式在后台运行预先将数据从WCF服务上获取过来并使用某种方式(现在打算采用静态变量方式)“缓存”起来,这样winform客户端每次启动时就可以直接从本地的windows服务上快速获取数据,提高响应速度。

这样的windows服务如何编写?

问题补充:

1、WCF服务首次启动响应客户端请求:

2、客户端第2次请求数据

3、客户端数据

山上山夫的主页 山上山夫 | 初学一级 | 园豆:159
提问于:2015-04-22 12:20
< >
分享
最佳答案
0

没必要吧,把你的打算用 Windows 服务要实现的功能直接放在 Winform 中就行,除非你需要多个进程共享数据。

收获园豆:15
Launcher | 高人七级 |园豆:45045 | 2015-04-22 12:29

题主的应用环境应该是这样的。

1、数据库或是WCF服务在远程,或叫云端。通常可能最多是10M光纤,低一些的应该也有可能是512M ADSL。

2、内部有N台客户端,希望有一台服务端,在本地(100M\1000M局域网)

3、这样等于本地缓存了一部分数据。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-04-22 12:48

@爱编程的大叔: 你的理解能力真强

Launcher | 园豆:45045 (高人七级) | 2015-04-22 12:51

@爱编程的大叔: 差不多就是这样的情况。

测试WCF服务端:在服务端首次启动并开始响应客户端请求时,在数据为10W级别的时候的第一次时获取时间大概在220秒-250秒左右。这其中经过了2次数据转换,1次是entity=>dto,1次是dto=>viewmodel,2次都采用手动映射,以前采用的AutoMapper方式更慢。 WCF服务端数据采用静态变量缓存。客户端的后续请求并获取数据时间大概在7-8秒左右。

如果每台客户端都在本地有一个服务将这些数据缓存起来,速度就快了。

没错,我就是这想法。

山上山夫 | 园豆:159 (初学一级) | 2015-04-22 14:21

@山上山夫: “每台客户端都在本地有一个服务” —— 我的理解是客户端和服务在同一台机器,而人家告诉你的是“2、内部有N台客户端,希望有一台服务端,在本地(100M\1000M局域网)”,翻译过来就是客户端和服务不在同一台机器。你到底说的是哪个?

Launcher | 园豆:45045 (高人七级) | 2015-04-22 14:51

@Launcher: 抱歉,没注意看清。

WCF服务端的部署可能在本地局域网,也可能是在广域网上吧。

客户端本来是直接来访问这个WCF服务的,我的想法就是因为获取数据的时间太长了(比如WCF服务第2次响应请求也要7-8秒),我的想法就是将一些没有同步要求的数据放置在本地,这样客户端就不用去到WCF服务器上再次请求数据了,这样就可以快速响应客户端的请求了。

如果按照这个思路走,那么就应该是每个客户端都有一个本地的windows服务之类的服务,能将数据“缓存”起来。

不知我这样描述你有没有理解了?谢谢

山上山夫 | 园豆:159 (初学一级) | 2015-04-22 15:02

@Launcher: 

也就是说这个windows服务程序去访问WCF服务提供的数据,并将数据拿到本地“缓存”起来,然后客户端在这个服务处拿到数据,因为是本地,貌似会快很多吧。

对,就是这样的要求。

山上山夫 | 园豆:159 (初学一级) | 2015-04-22 15:05

@山上山夫: 没必要吧,把你的打算用 Windows 服务要实现的功能直接放在 Winform 中就行,除非你需要多个进程共享数据。

 

那我还就这个回答,你没必要建立一个 Windows 服务,因为你是在同一台机器,又不需要跟其它进程共享数据通道,所以直接写到 Winform 程序中。

Launcher | 园豆:45045 (高人七级) | 2015-04-22 15:59

@Launcher:

也许吧。

我已经尝试了写了一个windows服务,但得到的结果和直接用winform调用WCF服务差不多,通过调试发现windows服务中设置的静态变量每次都会初始化,这样在一个会话中(是这样吗?也就是说每次调用windows服务是不同的session?)获取到的数据就不能在下次的会话中共享。

由于是第一次写windows服务,不太清楚windows服务中能否共享session。

谢谢你。

山上山夫 | 园豆:159 (初学一级) | 2015-04-22 19:29

@Launcher: 

 

应该是windows服务的session0的问题了。http://www.cnblogs.com/mengfanrong/p/4305102.html

山上山夫 | 园豆:159 (初学一级) | 2015-04-22 20:36

@山上山夫: 你是不是认为同样调用 WCF 的代码,在 Windows 服务中运行就会比在 Winform 中快?如果你觉得是的话,那你就等别人给答案吧!

Launcher | 园豆:45045 (高人七级) | 2015-04-23 09:27
其他回答(2)
0

这是打算实现一个应用服务器的啊。

这样的项目如果低于百万基本就没有任何意义了。

从你的描述中可以看出来你的知识面太窄,建议有空多看看书,以及多看看框架理论的博客。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-04-22 12:38

没那么高大上,很实在且简单的想法而已,看看能不能优化下而已吧。

支持(0) 反对(0) 山上山夫 | 园豆:159 (初学一级) | 2015-04-22 14:25

@山上山夫: 你的用户这么多,系统起码也得有几个亿了,失敬失敬。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2015-04-23 11:58
0

可以考虑使用数据库缓存数据。比如sqlite。

收获园豆:5
幻天芒 | 园豆:37175 (高人七级) | 2015-04-22 13:46

考虑过将数据用本地数据库方式缓存起来,比如:sqlce,sqlite。然后客户端读本地数据库,但如果本地windows服务能提供这样的缓存可能会更好吧?

支持(0) 反对(0) 山上山夫 | 园豆:159 (初学一级) | 2015-04-22 14:32

@山上山夫: 知识有限,我不知道如何去拿Windows服务缓存的数据。。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-04-22 15:00

@幻天芒: 谢谢你,我也是瞎折腾吧。

支持(0) 反对(0) 山上山夫 | 园豆:159 (初学一级) | 2015-04-22 15:15

@山上山夫: 没有时限的时候,可以瞎折腾,这是乐趣。。如果资源有限的话,就需要快速出结果。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2015-04-22 15:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册