2

似乎有与此相关的问题,但我没有看到涉及实际的 .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 个或更少的实例没有问题。

4

2 回答 2

2

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

如何增加 Windows 服务可以生成的子进程的最大数量——桌面堆限制

您只需要执行以下操作:

转到 regEdit,然后导航到键:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SubSystems

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

%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On 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=On 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

于 2018-11-12T00:29:40.470 回答
1

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

于 2012-10-02T13:39:11.720 回答