C# 什么会导致流程停止重新创建? 我们有一个C++编写的服务,通过CLI在.NET中编写了一些代码。由于第三方库在数据驱动的基础上重写内存,我们被迫将主处理代码剥离到单独的代码路径中,如下所示。当使用特定的命令行参数运行service EXE时,我们可以将整个服务作为控制台应用程序运行(绕过服务部件),也可以作为仅执行处理的控制台应用程序运行。在主操作模式下,服务正常启动,并使用createprocess通过命令行参数启动自己的可执行文件,该参数跳过服务初始化并转到处理部分。然后,服务线程等待子进程完成,并根据需要重复此进程

C# 什么会导致流程停止重新创建? 我们有一个C++编写的服务,通过CLI在.NET中编写了一些代码。由于第三方库在数据驱动的基础上重写内存,我们被迫将主处理代码剥离到单独的代码路径中,如下所示。当使用特定的命令行参数运行service EXE时,我们可以将整个服务作为控制台应用程序运行(绕过服务部件),也可以作为仅执行处理的控制台应用程序运行。在主操作模式下,服务正常启动,并使用createprocess通过命令行参数启动自己的可执行文件,该参数跳过服务初始化并转到处理部分。然后,服务线程等待子进程完成,并根据需要重复此进程,c#,c++,.net,windows,C#,C++,.net,Windows,我们遇到的问题是,在运行1700个子进程后,服务无法启动自身的命令行版本。如果我们运气不好,服务也会拒绝重新启动。当服务拒绝重新启动时,内存中没有相关进程。在服务失败后以命令行模式运行服务时,它将继续子进程的1700次运行,直到它也失败为止。需要重新启动系统才能恢复服务/命令行进程的工作。事件日志中还出现错误322-“目标设备没有足够的资源来完成操作。”。我们已经删除了一个作业内核对象,该对象将子进程和父进程分组为一个单元,以便在终止父进程时,子进程也会终止。这使1700的上限增加了几千 为什么

我们遇到的问题是,在运行1700个子进程后,服务无法启动自身的命令行版本。如果我们运气不好,服务也会拒绝重新启动。当服务拒绝重新启动时,内存中没有相关进程。在服务失败后以命令行模式运行服务时,它将继续子进程的1700次运行,直到它也失败为止。需要重新启动系统才能恢复服务/命令行进程的工作。事件日志中还出现错误322-“目标设备没有足够的资源来完成操作。”。我们已经删除了一个作业内核对象,该对象将子进程和父进程分组为一个单元,以便在终止父进程时,子进程也会终止。这使1700的上限增加了几千


为什么windows会记住某个进程已运行,并在重新运行时惩罚该进程?就这个问题而言,在不同桌面或用户下运行的进程似乎被视为单独的进程。当服务失败时,命令行版本可以运行,并将工作一段时间。这与桌面堆有关吗?我们的内存中永远不会同时有两个以上的进程。下一次在某个桌面/用户下运行时,什么类型的windows函数会对进程产生持久的影响?

听起来像是在泄漏父进程和子进程之间共享的内核资源。可能在每次启动子进程时,父进程都会创建某个资源的句柄并将其传递(共享)给子进程,希望子进程关闭它。。。但不按需要关闭它本身


SysInternals实用程序可以帮助您诊断此问题。HandleEx或Process Explorer启动,然后使用Process Monitor进行深入研究。

我与桌面堆共享了我的资源。请参阅,可能您还泄漏了桌面堆分配的对象。Registerwindowmessage是一个很好的开始。桌面堆分配的对象(如Windows或窗口消息注册)通常对这些工具不可见。您需要使用内核调试器来监视当前的桌面堆,或者像dheapmon@AloisKraus那样注入内核驱动程序:在这种上下文中,它似乎不太可能是桌面堆对象。父对象没有理由按每个子对象创建桌面堆对象,子对象创建的任何对象都应该像正常情况一样进行清理。仍然值得检查,但我会先检查内核对象。