From fae746e51c473bbe05c6b09edee4064803a680b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E5=9C=A3?= Date: Thu, 1 Sep 2016 11:37:39 +0800 Subject: [PATCH] Connector Dispose Fix --- Modbus.Net/Modbus.Net/ComConnector.cs | 51 ++++++++++++++++++++++++--- Modbus.Net/Modbus.Net/TcpConnector.cs | 42 ++++++++++++++++++++-- 2 files changed, 86 insertions(+), 7 deletions(-) diff --git a/Modbus.Net/Modbus.Net/ComConnector.cs b/Modbus.Net/Modbus.Net/ComConnector.cs index c50e27d..61504d3 100644 --- a/Modbus.Net/Modbus.Net/ComConnector.cs +++ b/Modbus.Net/Modbus.Net/ComConnector.cs @@ -366,14 +366,57 @@ namespace Modbus.Net return ByteToString(UnicodeEncoding.Default.GetBytes(InString)); } + /// +     /// 实现IDisposable接口 +     /// public void Dispose() { - if (_serialPort1 != null) + Dispose(true); + //.NET Framework 类库 + // GC..::.SuppressFinalize 方法 + //请求系统不要调用指定对象的终结器。 + GC.SuppressFinalize(this); + } + + private bool m_disposed = true; + + /// + /// 虚方法,可供子类重写 + /// + /// + protected virtual void Dispose(bool disposing) + { + if (!m_disposed) { - _serialPort1.Close(); - _serialPort1.Dispose(); - _serialPort1 = null; + if (disposing) + { + // Release managed resources + } + // Release unmanaged resources + if (_serialPort1 != null) + { + try + { + _serialPort1.Close(); + } + catch (Exception) + { + //ignore + } + _serialPort1.Dispose(); + _serialPort1 = null; + } + m_disposed = true; } } + + /// + /// 析构函数 + /// 当客户端没有显示调用Dispose()时由GC完成资源回收功能 + /// + ~ComConnector() + { + Dispose(false); + } } } diff --git a/Modbus.Net/Modbus.Net/TcpConnector.cs b/Modbus.Net/Modbus.Net/TcpConnector.cs index ca6f31c..e850616 100644 --- a/Modbus.Net/Modbus.Net/TcpConnector.cs +++ b/Modbus.Net/Modbus.Net/TcpConnector.cs @@ -62,15 +62,51 @@ namespace Modbus.Net public override bool IsConnected => _socketClient?.Client != null && _socketClient.Connected; + /// +     /// 实现IDisposable接口 +     /// public void Dispose() { - if (_socketClient != null) + Dispose(true); + //.NET Framework 类库 + // GC..::.SuppressFinalize 方法 + //请求系统不要调用指定对象的终结器。 + GC.SuppressFinalize(this); + } + + private bool m_disposed = false; + + /// + /// 虚方法,可供子类重写 + /// + /// + protected virtual void Dispose(bool disposing) + { + if (!m_disposed) { - CloseClientSocket(); - _socketClient.Client.Dispose(); + if (disposing) + { + // Release managed resources + } + // Release unmanaged resources + if (_socketClient != null) + { + CloseClientSocket(); + _socketClient.Client.Dispose(); + } + m_disposed = true; } } + /// + /// 析构函数 + /// 当客户端没有显示调用Dispose()时由GC完成资源回收功能 + /// + ~TcpConnector() + { + Dispose(false); + } + public override bool Connect() { return AsyncHelper.RunSync(ConnectAsync);