/// <summary>
        /// See interface docs.
        /// </summary>
        /// <param name="asyncResult"></param>
        /// <returns></returns>
        public int EndRead(IAsyncResult asyncResult)
        {
            int result = 0;

            try {
                result = _ReadBytesDelegate.EndInvoke(asyncResult);
            } catch (RemotingException) {
                // This happens when the provider is changed mid-read. The current design of the listener is flawed, it is
                // too hard to match up the begin reads and end reads when half the call is in the listener and the other
                // half is in the provider. However I'm too close to releasing this to redesign the way the listener and
                // providers interact and I while this isn't pretty and it can leak handles it should only happen very rarely,
                // so for now I'm just going to swallow the exception. In the next release of VRS I'll make the providers
                // more self-contained and make life a lot simpler, but probably at the expense of not being able to unit
                // test the reconnect logic... the reason we have this schizo behaviour is so that I can test that it'll
                // reconnect when a connection breaks, and it worked fine when all I had was the network provider, but now
                // that the COM port provider is on the scene it's just getting too damn fiddly. The providers need to be
                // more self-contained.
                //
                // The new provider model won't get done until after December 2012, I've a ton of paying work on up until
                // the end of the year... which is why I want to get this released sooner rather than later, if I don't get
                // it done now I won't have another chance until 2013.
            }
            if (result == 0 && (_Closing || _SerialPort == null || !_SerialPort.IsOpen))
            {
                throw new ObjectDisposedException("fake");                                                                         // Fake behaviour of a socket being closed - stops reconnect in listener;
            }
            return(result);
        }