Skip to content

Commit d90ec84

Browse files
authored
Avoid SerialPort IOLoop when there's no event handlers (#102829)
1 parent aaafed2 commit d90ec84

File tree

1 file changed

+41
-4
lines changed

1 file changed

+41
-4
lines changed

src/libraries/System.IO.Ports/src/System/IO/Ports/SerialPort.cs

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,14 @@ public partial class SerialPort : Component
6464
private char[] _singleCharBuffer;
6565

6666
public event SerialErrorReceivedEventHandler ErrorReceived;
67-
public event SerialPinChangedEventHandler PinChanged;
6867

69-
// handler for the underlying stream
68+
// handlers for the underlying stream
7069
private readonly SerialDataReceivedEventHandler _dataReceivedHandler;
70+
private readonly SerialPinChangedEventHandler _pinChangedHandler;
7171

7272
private SerialDataReceivedEventHandler _dataReceived;
73+
private SerialPinChangedEventHandler _pinChanged;
74+
7375
public event SerialDataReceivedEventHandler DataReceived
7476
{
7577
add
@@ -99,6 +101,35 @@ public event SerialDataReceivedEventHandler DataReceived
99101
}
100102
}
101103

104+
public event SerialPinChangedEventHandler PinChanged
105+
{
106+
add
107+
{
108+
bool wasNull = _pinChanged == null;
109+
_pinChanged += value;
110+
111+
if (wasNull)
112+
{
113+
if (_internalSerialStream != null)
114+
{
115+
_internalSerialStream.PinChanged += _pinChangedHandler;
116+
}
117+
}
118+
}
119+
remove
120+
{
121+
_pinChanged -= value;
122+
123+
if (_pinChanged == null)
124+
{
125+
if (_internalSerialStream != null)
126+
{
127+
_internalSerialStream.PinChanged -= _pinChangedHandler;
128+
}
129+
}
130+
}
131+
}
132+
102133
//--- component properties---------------*
103134

104135
// ---- SECTION: public properties --------------*
@@ -511,6 +542,7 @@ public int WriteTimeout
511542
public SerialPort()
512543
{
513544
_dataReceivedHandler = new SerialDataReceivedEventHandler(CatchReceivedEvents);
545+
_pinChangedHandler = CatchPinChangedEvents;
514546
}
515547

516548
public SerialPort(IContainer container) : this()
@@ -563,6 +595,7 @@ protected override void Dispose(bool disposing)
563595
if (IsOpen)
564596
{
565597
_internalSerialStream.DataReceived -= _dataReceivedHandler;
598+
_internalSerialStream.PinChanged -= _pinChangedHandler;
566599
_internalSerialStream.Flush();
567600
_internalSerialStream.Close();
568601
_internalSerialStream = null;
@@ -601,7 +634,11 @@ public void Open()
601634
_internalSerialStream.SetBufferSizes(_readBufferSize, _writeBufferSize);
602635

603636
_internalSerialStream.ErrorReceived += new SerialErrorReceivedEventHandler(CatchErrorEvents);
604-
_internalSerialStream.PinChanged += new SerialPinChangedEventHandler(CatchPinChangedEvents);
637+
638+
if (_pinChanged != null)
639+
{
640+
_internalSerialStream.PinChanged += _pinChangedHandler;
641+
}
605642

606643
if (_dataReceived != null)
607644
{
@@ -1213,7 +1250,7 @@ private void CatchErrorEvents(object src, SerialErrorReceivedEventArgs e)
12131250

12141251
private void CatchPinChangedEvents(object src, SerialPinChangedEventArgs e)
12151252
{
1216-
SerialPinChangedEventHandler eventHandler = PinChanged;
1253+
SerialPinChangedEventHandler eventHandler = _pinChanged;
12171254
SerialStream stream = _internalSerialStream;
12181255

12191256
if ((eventHandler != null) && (stream != null))

0 commit comments

Comments
 (0)