title: SerialPort.DataReceived repeatedly subscribe/unsubscribe
body: <p>I am using a serial port to communicate with a remote diagnostics device.  </p>
  
  <p>The length of the response from the remote device varies depending upon the command but is known ahead of time.  So, currently I send the command and wait for the required number of response bytes to be received.  </p>
  
  <p>I subscribe to the 'SerialPort.DataReceived' event whenever I'm not actively soliciting data.  The handler for this event simply dumps any 'unsolicited' received data to a log (unsolicited data is typically only received if the remote device restarts unexpectedly, etc).</p>
  
  <p>In some cases I want to send commands at a rate of about 60Hz.  </p>
  
  <p>My question is whether it's best to unsubscribe/subscribe to the 'SerialPort.DataReceived' event every time I call my 'SendCommand' method to actively solicit data, or should I leave the event subscription alone and just toggle a boolean 'TransferInProgress' flag that the DataReceived handler can use to ignore incoming data when I'm actively soliciting it?</p>
  
  <p>Here's the current implementation:</p>
  
  <pre><code>public virtual bool SendCommand(byte[] command, ref byte[] response) {
  
      try {
          TransferInProgress = true;
          OnTransferStarted();
  
          // temporarily unsubscribe since we're actively soliciting data
          _port.DataReceived -=
              new SerialDataReceivedEventHandler(SerialPort_DataReceived);
  
          _port.DiscardInBuffer();
          _port.Write(command, 0, command.Length);
          OnCommandSent(command);
  
          // read the requested number of response bytes
          int responseBytesRead = 0;
  
          while (responseBytesRead &lt; response.Length) {
              responseBytesRead +=
                  _port.Read(response, responseBytesRead, (response.Length - responseBytesRead));
          }
  
          OnCommandResponseReceived(response);
          return true;
      }
      catch (Exception ex) {
          OnCommandSendFailed(ex.Message);
          return false;
      }
      finally {
          _port.DataReceived +=
              new SerialDataReceivedEventHandler(SerialPort_DataReceived);
          OnTransferComplete();
          TransferInProgress = false;
      }
  }
  </code></pre>
  
  <p>-Trevor</p>