我开始Process
然后我想确保它会正确关闭。我使用Process.Close()
来关闭它,但有时它仍然锁定了资源。我可以看到我们有Process.Dispose()
方法。我只是想知道它们之间的实际差异是什么,我应该将它们都称为确保流程将被关闭?
p.Dispose();
p.Close();
答案 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()
vsDispose()
方法
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类来说,反之亦然。