繁体   English   中英

如何在不终止进程的情况下处理System.Diagnostics.Process对象?

[英]How to dispose a System.Diagnostics.Process object without killing process?

我有一个创建Process对象以启动外部应用程序的应用程序。 一旦它验证了应用程序已正确启动,就不再在乎它了,因此不再需要Process对象,但是由于不想关闭进程,所以无法对其调用Dispose()。 解决方法是什么?

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

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();
    }
}

实际上,该过程(Notepad.exe)甚至会在您的.NET应用终止后运行。 顺便说一句,这是我建议不要担心Process实例并在实际终止之前将其处置的原因之一:您将失去控制手柄以停止OS进程或查询其状态。 除非您有无数的Process实例,否则我不必担心它们。

我认为Process.Close()Process.Dispose() 不会杀死进程。 他们只是释放一些与处理过程有关的资源。

参考来源

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();
    }
}

我看不到任何可以终止该过程的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM