Process.Close()和Process.Dispose()之间有什么区别

本文关键字:Process 什么 区别 Close Dispose 之间 | 更新日期: 2023-09-27 18:22:31

我启动了一个Process,然后我想确保它会正确关闭。我已经使用Process.Close()来关闭它,但有时它仍然锁定资源。我可以看到我们有Process.Dispose()方法。我只想知道它们之间的实际差异是什么,我应该同时调用它们以确保流程将关闭吗?

p.Dispose();
p.Close();

Process.Close()和Process.Dispose()之间有什么区别

来自Process.Close()的文档;

Dispose方法调用Close。将Process对象放置在using中块处理资源而不需要调用Close

也就是说,没有区别。在内部,据我所知,.NET中的所有Close方法都调用Dispose方法。

如果你看参考来源;

public void Close()
{
      ...        
      m_processHandle.Close();
      ...
}

并且该方法调用;

public void Close() {
    Dispose(true);
}

您应该始终Process对象使用using语句。它允许提前清理资源,这样您就不需要等到它们被垃圾收集。

Close()Dispose()方法的区别

Close()Dispose()方法

Close()Dispose()之间的基本区别在于,当调用Close()方法时,任何托管资源都可以暂时关闭,并可以再次打开。这意味着对于相同的对象,资源可以重新打开或使用。而Dispose()方法从内存中永久删除任何(未管理的)资源以进行清理,并且该资源不再存在以进行任何进一步处理。

显示Close()Dispose()方法之间差异的示例:

using System;
using System.Data;
using System.Data.SqlClient;
public class Test
{
    private string connString = "Data Source=COMP3;Initial Catalog=Northwind;User Id=sa;Password=pass";
    private SqlConnection connection;
    public Test()
    {
        connection = new SqlConnection(connString);
    }
    private static void Main()
    {
        Test t = new Test();
        t.ConnectionStatus();
        Console.ReadLine();
    }
    public void ConnectionStatus()
    {
        try
        {
            if(connection.State == ConnectionState.Closed)
            {
                connection.Open();
                Console.WriteLine("Connection opened..");
            }
            if(connection.State == ConnectionState.Open)
            {
                connection.Close();
                Console.WriteLine("Connection closed..");
            }
            // connection.Dispose();
            if(connection.State == ConnectionState.Closed)
            {
                connection.Open();
                Console.WriteLine("Connection again opened..");
            }
        }
        catch(SqlException ex)
        {
            Console.WriteLine(ex.Message+"'n"+ex.StackTrace);
        }
        catch(Exception ey)
        {
            Console.WriteLine(ey.Message+"'n"+ey.StackTrace);
        }
        finally
        {
            Console.WriteLine("Connection closed and disposed..");
            connection.Dispose();
        }
    }
}

在上面的例子中,如果您取消注释connection.Dispose()方法并执行,您将得到一个异常,如

ConnectionString属性尚未初始化。

这就是CCD_ 26和CCD_ 27之间的区别。

通常释放类内的UnManaged资源。它对过程本身没有影响。

到目前为止要处理。从MSDN上获取的关闭方法:

释放与此组件关联的所有资源。参考:MSDN Process.Close()

因此,从外部来看没有什么不同,但让我们看看光荣的.net SourceCode:Process

   /// <devdoc>
    ///    <para>
    ///       Frees any resources associated with this component.
    ///    </para>
    /// </devdoc>
    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();
        }
    }

当处理这个时

    /// <internalonly/>
    /// <devdoc>
    ///    <para>
    ///       Free any resources associated with this component.
    ///    </para>
    /// </devdoc>
    protected override void Dispose(bool disposing) {
        if( !disposed) {
            if (disposing) {
                //Dispose managed and unmanaged resources
                Close();
            }
            this.disposed = true;
            base.Dispose(disposing);                
        }            
    }

正如你所看到的,即使在内部也没有区别。Dispose只是将封闭的mehtod包裹起来。

这是MSDN真正有助于的情况之一

https://msdn.microsoft.com/en-us/library/fs2xkftw(v=vs.110).aspx

注意,如果你想使用"using"结构:

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

您需要您的对象来支持IDisposable,并且:

IDisposable接口需要实现单个无参数方法Dispose。

Dispose方法也是垃圾收集器在删除对对象的所有引用之前所调用的方法,以确保对象被很好地清理。。

因此,IDisposable的实现和使用是确保在垃圾收集器实际从内存中删除对象之前释放对象所占用的资源的一种方式。。

您可以使用using 强制执行此操作

一般关闭不会实现这一点。但有时它确实包含Dispose方法:https://msdn.microsoft.com/en-us/library/system.io.stream.close(v=vs.110).aspx

关闭当前流并释放与当前流关联的任何资源(如套接字和文件句柄)。与其调用此方法,不如确保正确地处理了流。

对于Process类,情况正好相反。