您可以创建和启动的Process对象的数量是否有限制?

时间:2012-10-01 19:54:17

标签: c# .net windows process windows-server-2008-r2

似乎有一些问题接近于此,但我没有看到任何涉及实际的.Net Process对象。目前,我正在使用Process对象启动外部可执行文件并从C#中读取数据。对于我必须监视数据的每个收集点,这发生一次。但是,当我必须监视5个或更多收集点时,我的第五个收集点的进程被杀死,然后才能从中收集任何数据。用于启动Process对象的代码如下所示。任何帮助表示赞赏。

    procCollectionMonitor = new Process();
    procCollectionMonitor.StartInfo.FileName = options.CollectionMonitorProcessPath;

    procCollectionMonitor.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(options.CollectionMonitorProcessPath);
    procCollectionMonitor.StartInfo.ErrorDialog = false;

    procCollectionMonitor.StartInfo.UseShellExecute = false;

    procCollectionMonitor.EnableRaisingEvents = true;
    procCollectionMonitor.Exited += spawn_Exited;
    procCollectionMonitor.Start();

此应用程序是Windows服务,在Windows Server 2008 R2上运行。正如我之前所说,只有在启动5个或更多收集点时才会出现此问题。需要4个或更少的实例没有问题。

2 个答案:

答案 0 :(得分:3)

由于您使用的是Windows服务,因此肯定存在限制。可以通过桌面堆控制该限制。请查看以下答案,以获取更多详细信息:

How to increase the maximum number of child processes that can be spawned by a windows service -- desktop heap limits

您只需要执行以下操作:

转到regEdit,然后导航至键:

  

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session   Manager \ Subsystems

从以下位置编辑名为“ Windows”的密钥:

  

%SystemRoot%\ system32 \ csrss.exe ObjectDirectory = \ Windows   SharedSection = 1024,20480,768 Windows =在SubSystemType = Windows上   ServerDll = basesrv,1 ServerDll = winsrv:UserServerDllInitialization,3   ServerDll = sxssrv,4 ProfileControl = Off MaxRequestThreads = 16

收件人:

  

%SystemRoot%\ system32 \ csrss.exe ObjectDirectory = \ Windows   SharedSection = 1024,20480, 2048 Windows =在SubSystemType = Windows上   ServerDll = basesrv,1 ServerDll = winsrv:UserServerDllInitialization,3   ServerDll = sxssrv,4 ProfileControl = Off MaxRequestThreads = 16

这也应该解决该问题,我认为最佳解决方案将是找到一种解决方法,以独立于Window服务(直到现在我还不知道如何)启动该过程

更新: 我找到了解决此问题的解决方法...您可以使用方法“ CreateProcessAsUser”了解更多详细信息,请检查以下链接:

https://www.codeproject.com/Articles/35773//Articles/35773/Subverting-Vista-UAC-in-Both-32-and-64-bit-Archite

答案 1 :(得分:1)

您可以开始的流程数量没有实际限制。从五开始肯定不是问题。您对C#和.NET的使用不会产生任何影响。 .NET中的Process类只是Win32 CreateProcess和ShellExecuteEx API的托管包装器。问题必须在于您正在启动的程序。你需要对其进行分析以弄清楚发生了什么。