none
Windows服务启动应用程序进行事务处理的问题 RRS feed

  • 问题

  • 有个项目是由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;
            }

    请问各位高手有没有好的优化方法?

    2012年2月17日 9:56

答案

  • 您好,

    根据你贴出的代码,这个方法只是重新启动了一个新的进程,但是这段代码并不涉及你的Windows服务中的工作。所以,这个代码没有用来提升性能的作用。

    当你启动一个进程来开启相关的Windows服务的时候,在那个进程中工作的代码才是需要您来进行维护和优化的方向。

    当我们在进程中运行一个长期工作的循环的时候,如果不加以停止,CPU就会无限期不间歇地工作,从而导致工作量加大,所以,我们会使用Thread.Sleep(milliseconds) 来使得我们的线程在循环期间能歇息下一。当然,时间根据您对性能的要求来定!


    Neddy Ren[MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Neddy Ren 2012年3月7日 8:49
    2012年2月20日 9:26

全部回复

  • 真郁闷呀, 怎么没有人回答我的问题呢?
    2012年2月20日 8:35
  • 您好,

    根据你贴出的代码,这个方法只是重新启动了一个新的进程,但是这段代码并不涉及你的Windows服务中的工作。所以,这个代码没有用来提升性能的作用。

    当你启动一个进程来开启相关的Windows服务的时候,在那个进程中工作的代码才是需要您来进行维护和优化的方向。

    当我们在进程中运行一个长期工作的循环的时候,如果不加以停止,CPU就会无限期不间歇地工作,从而导致工作量加大,所以,我们会使用Thread.Sleep(milliseconds) 来使得我们的线程在循环期间能歇息下一。当然,时间根据您对性能的要求来定!


    Neddy Ren[MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Neddy Ren 2012年3月7日 8:49
    2012年2月20日 9:26