流程类启动泄漏存储

时间:2019-04-17 10:33:51

标签: c# memory-leaks process.start

我有一个程序,该程序会定期启动具有Process.Start()功能的另一个进程。

几个小时后,我可以使用Windows资源监视器检测到内存泄漏。 我可以看到在

上键入"Key"的大量Handles。
  

“ \ REGISTRY \ MACHINE \ SOFTWARE \ Classes.exe”

     

“ \ REGISTRY \ MACHINE \ SOFTWARE \ Classes \ exefile”

     

“ \ REGISTRY \ MACHINE \ SOFTWARE \ Classes \ exefile \ shell \ open”

这是我的代码: 我的代码很简单:

            Process streamerProcess = new Process();
            streamerProcess.StartInfo.FileName = SEStreamRequester.StreamerPath;
            streamerProcess.StartInfo.Arguments = parameters;

            try {
                streamerProcess.Start();
                m_streamerPid = streamerProcess.Id;
            }
            catch(Exception e) {
                m_streamerPid = 0;
                throw new System.ComponentModel.Win32Exception(
                    string.Format("Error while start streamer:{0}", e.Message)
                    , e
                );
            }
            finally {
                streamerProcess.Dispose();
            }

其中parametersSEStreamRequester.StreamerPath是字符串

如果我正确地处置了所有Process实例,我便在代码中进行搜索,我认为是这样。您如何确认这些Handle被Process实例使用? 我如何找到泄漏的来源?

谢谢。

1 个答案:

答案 0 :(得分:0)

我将尝试根据您给出的上下文来制定答案。如果您在处理完成后不处理该对象,则该对象将保持活动状态。

我建议您使用“使用”来初始化进程。块完成后,“使用”将为您处理。

 using (Process process = new Process("Cmd.exe", commandString))
        {
         process.Start();
        }

只要您确实处置了对象。垃圾收集器应该做剩下的!也许请查看以下文档:https://docs.microsoft.com/en-us/dotnet/api/system.idisposable.dispose?view=netframework-4.7.2

这是有关垃圾回收的更多信息:https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/