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

时间:2015-11-19 11:44:53

标签: c# process

我开始Process然后我想确保它会正确关闭。我使用Process.Close()来关闭它,但有时它仍然锁定了资源。我可以看到我们有Process.Dispose()方法。我只是想知道它们之间的实际差异是什么,我应该将它们都称为确保流程将被关闭?

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

4 个答案:

答案 0 :(得分:6)

来自documentation of Process.Close();

  

Dispose方法调用Close。将Process对象置于using block处理资源,而无需调用Close

这意味着,没有区别。在内部,据我所知,.NET中的所有Close方法都调用Dispose方法。

如果你看reference source;

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

和此方法calls;

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

您应该始终使用using对象的Process语句。它允许尽早清理资源,因此您无需等到它们收集垃圾。

答案 1 :(得分:1)

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

到目前为止,处置。从MSDN中获取Close mehtod:

  

释放与此组件关联的所有资源。   参考: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();
        }
    }

虽然dispose这样做

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

你可以看到,即使在内部也没有区别。处理只是封闭了mehtod。

答案 2 :(得分:1)

Close()Dispose()方法之间的区别

Close() vs 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属性尚未初始化。

这是Close()Dispose()之间的区别。

答案 3 :(得分:0)

这是MSDN实际上非常有用的案例之一

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

请注意,如果你想使用&#34;使用&#34;构造:

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

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

  

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

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

因此,在通过垃圾收集器从内存中删除对象之前,IDisposable的实现及其使用是一种确保对象拥抱的资源被释放的方法。

您可以使用using

强制执行此操作

通用关闭并未实现此功能。 但有时它会包装Dispose方法: https://msdn.microsoft.com/en-us/library/system.io.stream.close(v=vs.110).aspx

  

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

对于Process类来说,反之亦然。