如何在不杀死进程的情况下处置System.Diagnostics.Process对象?

时间:2015-05-28 14:53:44

标签: c# .net

我有一个创建Process对象的应用程序,以便启动外部应用程序。一旦它验证应用程序已正确启动,它就不再关心它,所以我不再需要Process对象,但我不能在它上面调用Dispose(),因为我不想关闭该进程。解决方法是什么?

2 个答案:

答案 0 :(得分:8)

您可以安全地处理流程实例,该流程将在之后运行。

class Program
{
    static void Main(string[] args)
    {
        Process p = new Process
        {
            StartInfo = {FileName = "notepad.exe"}
        };
        p.Start();

        p.Dispose();
        // Notepad still runs...
        GC.Collect(); // Just for the diagnostics....
        // Notepad still runs...
        Console.ReadKey();
    }
}

实际上,在您的.NET应用程序终止后,该过程(Notepad.exe)甚至会运行。顺便说一下,这是我建议不要担心流程实例并在流程实际终止之前处理它们的原因之一:您将丢失控制句柄以停止操作系统进程或查询其状态。除非你有多个Process实例,否则我不应该担心它们。

答案 1 :(得分:1)

我认为Process.Close()Process.Dispose() 不会终止该进程。他们只是释放一些与处理流程相关的资源。

来自reference source

protected override void Dispose(bool disposing) {
    if( !disposed) {
        if (disposing) {
            //Dispose managed and unmanaged resources
            Close();
        }
        this.disposed = true;
        base.Dispose(disposing);                
    }            
}

public void Close() {
    if (Associated) {
        if (haveProcessHandle) {
            StopWatchingForExit();
            Debug.WriteLineIf(processTracing.TraceVerbose, "Process - CloseHandle(process) in Close()");
            m_processHandle.Close();
            m_processHandle = null;
            haveProcessHandle = false;
        }
        haveProcessId = false;
        isRemoteMachine = false;
        machineName = ".";
        raisedOnExited = false;

        //Don't call close on the Readers and writers
        //since they might be referenced by somebody else while the 
        //process is still alive but this method called.
        standardOutput = null;
        standardInput = null;
        standardError = null;

        output = null;
        error = null;

        Refresh();
    }
}

我没有看到任何会破坏这一过程的事情。