首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能在一台机器上启动超过X个用.Net开发的windows服务

为什么我不能在一台机器上启动超过X个用.Net开发的windows服务
EN

Stack Overflow用户
提问于 2010-01-12 11:03:30
回答 1查看 725关注 0票数 2

我偶然发现了这样一种情况,即我无法启动超过一定数量的.Net windows服务。我们的软件系统是8-9个windows服务的集合,我想在一台机器上创建5个逻辑环境(即大约40个服务)。为了重现这个问题并证明它不是一个应用程序问题,我创建了一个简单的windows服务。

我正在将它编译成TestService.exe,然后创建30个副本。从TestService01.exe到TestService30.exe。我正在使用SC安装服务,如下所示

代码语言:javascript
运行
复制
SC create "Test Service Copy 01" start= demand binpath= "C:\Temp\TestService\TestService01.exe" obj= "mydomain\myservices" password= "myservicepwd" displayname= "Test Service Copy 01"

现在,我可以在windows server2003机器上启动15到25个这样的服务。在那之后,我就不能再启动其他服务了。它将失败,并显示错误消息框

代码语言:javascript
运行
复制
TestService18.exe - Application Error 
--------------------------- 
The exception unknown software exception (0xc06d007e) occurred in the application at location 0x7c812afb. 


--------------------------- 
OK   Cancel    
---------------------------  

可能导致此错误的原因。您可以在windows服务器上运行的.Net服务的数量有上限吗?

我已经在ServerFault上问过这个问题了。链接为here

代码:

代码语言:javascript
运行
复制
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.ServiceProcess;
using System.Threading;

namespace TestService
{
    public class MyService : ServiceBase
    {
        private Timer stateTimer;
        private readonly TimerCallback timerDelegate = WriteToLog;
        static readonly string fileName = @"C:\temp\Testservice\Log\" + new Random().Next() + ".txt";
        public MyService()
        {
            ServiceName = "Test Service";
            CanStop = true;
            CanPauseAndContinue = false;
            AutoLog = true;
        }

        protected override void OnStart(string[] args)
        {
            using (StreamWriter writer = new StreamWriter(fileName, true))
            {
                writer.WriteLine("Starting ...");
                writer.WriteLine(Assembly.GetExecutingAssembly().Location);
            }
            stateTimer = new Timer(timerDelegate, null, 1000, 1000);
        }

        protected override void OnStop()
        {
            stateTimer.Dispose();
        }

        static void WriteToLog(object stateObject)
        {
            using (StreamWriter writer = new StreamWriter(fileName, true))
            {
                writer.WriteLine(DateTime.Now.Ticks);
            }
        }

        public static void Main()
        {
            Run(new MyService());
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-01-12 11:11:29

您可能遇到了众所周知的桌面堆限制,默认情况下,它将与用户界面和桌面相关的内存限制为48MB。一个典型的服务可能会消耗几百on的桌面堆,所以考虑到系统上正在运行的其他应用程序,您只能启动20个左右也就不足为奇了。

有关更多信息,请参阅。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2046443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档