protected override void DoWaitForCompleteStop() { const string FROM = "GlueService.DoWaitForCompleteStop()"; const string STOP = "stopping"; base.DoWaitForCompleteStop(); try { m_Thread.Join(); m_Thread = null; foreach (var s in m_Servers) { run(() => s.Close(), STOP, "server", s.Name, s.GetType(), false); } foreach (var b in m_Bindings) { run(() => b.WaitForCompleteStop(), STOP, "binding", b.Name, b.GetType(), false); } foreach (var p in m_Providers) { run(() => p.WaitForCompleteStop(), STOP, "provider", p.Name, p.GetType(), false); } run(() => m_ServerHandler.WaitForCompleteStop(), STOP, "server handler", m_ServerHandler.Name, m_ServerHandler.GetType(), false); m_ServerHandler.Dispose(); m_ServerHandler = null; m_Calls = null; } catch (Exception error) { if (m_ServerHandler != null) { try { m_ServerHandler.Dispose(); m_ServerHandler = null; } catch { } } log(MessageType.CatastrophicError, "Exception: " + error.ToMessageWithType(), FROM); throw error; } }
protected override void DoWaitForCompleteStop() { const string STOP = "stopping"; base.DoWaitForCompleteStop(); try { m_Thread.Join(); m_Thread = null; foreach (var s in m_Servers) { run(() => s.Close(), STOP, "server", s.Name, s.GetType(), false); } foreach (var b in m_Bindings) { run(() => b.WaitForCompleteStop(), STOP, "binding", b.Name, b.GetType(), false); } foreach (var p in m_Providers) { run(() => p.WaitForCompleteStop(), STOP, "provider", p.Name, p.GetType(), false); } run(() => m_ServerHandler.WaitForCompleteStop(), STOP, "server handler", m_ServerHandler.Name, m_ServerHandler.GetType(), false); DisposeAndNull(ref m_ServerHandler); m_Calls = null; m_CallsWithTasks.ScanAll(); m_CallsWithTasks = null; } catch (Exception error) { try { DisposeAndNull(ref m_ServerHandler); } catch (Exception she) { WriteLog(MessageType.CatastrophicError, nameof(DoWaitForCompleteStop), "DisposeAndNull(ref m_ServerHandler) leaked: " + she.ToMessageWithType(), she); } WriteLog(MessageType.CatastrophicError, nameof(DoWaitForCompleteStop), "Leaked exception: " + error.ToMessageWithType(), error); throw error; } }