///<summary>Try to close connection in a graceful way</summary> ///<remarks> ///<para> ///Shutdown reason contains code and text assigned when closing the connection, ///as well as the information about what initiated the close ///</para> ///<para> ///Abort flag, if true, signals to close the ongoing connection immediately ///and do not report any errors if it was already closed. ///</para> ///<para> ///Timeout determines how much time internal close operations should be given ///to complete. Negative or Timeout.Infinite value mean infinity. ///</para> ///</remarks> public void Close(ShutdownEventArgs reason, bool abort, int timeout) { if (!SetCloseReason(reason)) { if (!abort) { throw new AlreadyClosedException(m_closeReason); } } else { OnShutdown(); m_session0.SetSessionClosing(false); try { // Try to send connection.close // Wait for CloseOk in the MainLoop m_session0.Transmit(ConnectionCloseWrapper(reason.ReplyCode, reason.ReplyText)); } catch (AlreadyClosedException ace) { if (!abort) { throw ace; } } #pragma warning disable 0168 catch (NotSupportedException nse) { // buffered stream had unread data in it and Flush() // was called, ignore to not confuse the user } #pragma warning restore 0168 catch (IOException ioe) { if (m_model0.CloseReason == null) { if (!abort) { throw ioe; } else { LogCloseError("Couldn't close connection cleanly. " + "Socket closed unexpectedly", ioe); } } } finally { TerminateMainloop(); } } if (!m_appContinuation.WaitOne(BlockingCell.validatedTimeout(timeout), true)) { m_frameHandler.Close(); } }
///<summary>Try to close connection in a graceful way</summary> ///<remarks> ///<para> ///Shutdown reason contains code and text assigned when closing the connection, ///as well as the information about what initiated the close ///</para> ///<para> ///Abort flag, if true, signals to close the ongoing connection immediately ///and do not report any errors if it was already closed. ///</para> ///<para> ///Timeout determines how much time internal close operations should be given ///to complete. Negative or Timeout.Infinite value mean infinity. ///</para> ///</remarks> public async Task Close(ShutdownEventArgs reason, bool abort, int timeout) { if (!SetCloseReason(reason)) { if (!abort) { throw new AlreadyClosedException(m_closeReason); } } else { await OnShutdown(); m_session0.SetSessionClosing(false); try { // Try to send connection.close // Wait for CloseOk in the MainLoop await m_session0.Transmit(ConnectionCloseWrapper(reason.ReplyCode, reason.ReplyText)); } catch (AlreadyClosedException ace) { if (!abort) { throw ace; } } #pragma warning disable 0168 catch (NotSupportedException nse) { // buffered stream had unread data in it and Flush() // was called, ignore to not confuse the user } #pragma warning restore 0168 catch (IOException ioe) { if (m_model0.CloseReason == null) { if (!abort) { throw ioe; } else { LogCloseError("Couldn't close connection cleanly. " + "Socket closed unexpectedly", ioe); } } } finally { TerminateMainloop(); } } var vTask = m_appContinuation.WaitAsync(); if (!vTask.IsCompletedSuccessfully) { var task = vTask.AsTask(); if (await Task.WhenAny(task, Task.Delay(ValidatedTimeout(timeout))) != task) { m_frameHandler.Close(); } } }