diff --git a/src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs b/src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs index 426eb77d637d5..db12734b0b219 100644 --- a/src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs +++ b/src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs @@ -64,12 +64,14 @@ public partial class SerialPort : Component private char[] _singleCharBuffer; public event SerialErrorReceivedEventHandler ErrorReceived; - public event SerialPinChangedEventHandler PinChanged; - // handler for the underlying stream + // handlers for the underlying stream private readonly SerialDataReceivedEventHandler _dataReceivedHandler; + private readonly SerialPinChangedEventHandler _pinChangedHandler; private SerialDataReceivedEventHandler _dataReceived; + private SerialPinChangedEventHandler _pinChanged; + public event SerialDataReceivedEventHandler DataReceived { add @@ -99,6 +101,35 @@ public event SerialDataReceivedEventHandler DataReceived } } + public event SerialPinChangedEventHandler PinChanged + { + add + { + bool wasNull = _pinChanged == null; + _pinChanged += value; + + if (wasNull) + { + if (_internalSerialStream != null) + { + _internalSerialStream.PinChanged += _pinChangedHandler; + } + } + } + remove + { + _pinChanged -= value; + + if (_pinChanged == null) + { + if (_internalSerialStream != null) + { + _internalSerialStream.PinChanged -= _pinChangedHandler; + } + } + } + } + //--- component properties---------------* // ---- SECTION: public properties --------------* @@ -511,6 +542,7 @@ public int WriteTimeout public SerialPort() { _dataReceivedHandler = new SerialDataReceivedEventHandler(CatchReceivedEvents); + _pinChangedHandler = CatchPinChangedEvents; } public SerialPort(IContainer container) : this() @@ -563,6 +595,7 @@ protected override void Dispose(bool disposing) if (IsOpen) { _internalSerialStream.DataReceived -= _dataReceivedHandler; + _internalSerialStream.PinChanged -= _pinChangedHandler; _internalSerialStream.Flush(); _internalSerialStream.Close(); _internalSerialStream = null; @@ -601,7 +634,11 @@ public void Open() _internalSerialStream.SetBufferSizes(_readBufferSize, _writeBufferSize); _internalSerialStream.ErrorReceived += new SerialErrorReceivedEventHandler(CatchErrorEvents); - _internalSerialStream.PinChanged += new SerialPinChangedEventHandler(CatchPinChangedEvents); + + if (_pinChanged != null) + { + _internalSerialStream.PinChanged += _pinChangedHandler; + } if (_dataReceived != null) { @@ -1213,7 +1250,7 @@ private void CatchErrorEvents(object src, SerialErrorReceivedEventArgs e) private void CatchPinChangedEvents(object src, SerialPinChangedEventArgs e) { - SerialPinChangedEventHandler eventHandler = PinChanged; + SerialPinChangedEventHandler eventHandler = _pinChanged; SerialStream stream = _internalSerialStream; if ((eventHandler != null) && (stream != null))