积极答复者
Windows服务启动应用程序进行事务处理的问题

问题
-
有个项目是由B/S+Windows服务组成。 B/S用于用户的输入处理,Windows服务用于数据分析及发送事务通知,每秒钟执行一次。
本来这种架构是没有问题的,但是客户要求在同一台服务器上安装多套系统。由于 一台机器只能安装一个Windows服务(Windows服务不能同名),所以问题就来了。 一台服务器可以安装多个B/S但是没有办法安装多个Windows服务(由于Windows服务同名的原因)。
针对上面的问题对系统的架构做了调整,如下图所示:
Windows服务通过线程启动 TaskLoader(一个应用程序)来执行事务处理。这种架构能实现客户的需求,但是Windows服务通过线程启动TaskLoader时,对服务器的Cpu资源占用比大。通过测试Windows服务启动三个TaskLoader(在TaskLoader里未做任何事务处理,只是启动应用程序)Cpu占用达到10%。
Windows服务启动TaskLoader的代码如下:
public static string ExecCommand(string command, string para, string workingDirectory = null) { Process myProcess = new Process(); myProcess.StartInfo.FileName = command; myProcess.StartInfo.Arguments = para; myProcess.StartInfo.UseShellExecute = false; myProcess.StartInfo.RedirectStandardInput = true; myProcess.StartInfo.RedirectStandardOutput = true; myProcess.StartInfo.RedirectStandardError = true; myProcess.StartInfo.CreateNoWindow = true; if (!string.IsNullOrEmpty(workingDirectory)) myProcess.StartInfo.WorkingDirectory = workingDirectory; myProcess.Start(); string outString = myProcess.StandardOutput.ReadToEnd(); myProcess.WaitForExit(); return outString; }
请问各位高手有没有好的优化方法?
答案
-
您好,
根据你贴出的代码,这个方法只是重新启动了一个新的进程,但是这段代码并不涉及你的Windows服务中的工作。所以,这个代码没有用来提升性能的作用。
当你启动一个进程来开启相关的Windows服务的时候,在那个进程中工作的代码才是需要您来进行维护和优化的方向。
当我们在进程中运行一个长期工作的循环的时候,如果不加以停止,CPU就会无限期不间歇地工作,从而导致工作量加大,所以,我们会使用Thread.Sleep(milliseconds) 来使得我们的线程在循环期间能歇息下一。当然,时间根据您对性能的要求来定!
Neddy Ren[MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Neddy Ren 2012年3月7日 8:49
全部回复
-
您好,
根据你贴出的代码,这个方法只是重新启动了一个新的进程,但是这段代码并不涉及你的Windows服务中的工作。所以,这个代码没有用来提升性能的作用。
当你启动一个进程来开启相关的Windows服务的时候,在那个进程中工作的代码才是需要您来进行维护和优化的方向。
当我们在进程中运行一个长期工作的循环的时候,如果不加以停止,CPU就会无限期不间歇地工作,从而导致工作量加大,所以,我们会使用Thread.Sleep(milliseconds) 来使得我们的线程在循环期间能歇息下一。当然,时间根据您对性能的要求来定!
Neddy Ren[MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Neddy Ren 2012年3月7日 8:49