public void Stop(TimeSpan timeout) { lock (_startLock) { // Wait for the connection to connect if (_connectTask != null) { try { _connectTask.Wait(timeout); } catch (Exception ex) { Trace(TraceLevels.Events, "Error: {0}", ex.GetBaseException()); } } // This is racy since it's outside the _stateLock, but we are trying to avoid 30s deadlocks when calling _transport.Abort() if (State == ConnectionState.Disconnected) { return; } Trace(TraceLevels.Events, "Stop"); // Dispose the heart beat monitor so we don't fire notifications when waiting to abort _monitor.Dispose(); _transport.Abort(this, timeout, _connectionData); Disconnect(); } }
public void Stop(TimeSpan timeout) { lock (_startLock) { // Wait for the connection to connect if (_connectTask != null) { try { _connectTask.Wait(timeout); } catch (Exception ex) { Trace(TraceLevels.Events, "Error: {0}", ex.GetBaseException()); } } if (_receiveQueue != null) { // Close the receive queue so currently running receive callback finishes and no more are run. // We can't wait on the result of the drain because this method may be on the stack of the task returned (aka deadlock). _receiveQueue.Drain().Catch(); } // This is racy since it's outside the _stateLock, but we are trying to avoid 30s deadlocks when calling _transport.Abort() if (State == ConnectionState.Disconnected) { return; } Trace(TraceLevels.Events, "Stop"); // Dispose the heart beat monitor so we don't fire notifications when waiting to abort _monitor.Dispose(); _transport.Abort(this, timeout, _connectionData); Disconnect(); } }