protected override void DisposeOfManagedResources()
{
Log.Info("stopping tasks");
_cancellationTokenSource.Cancel();
try
{
Task.WaitAll(_mainTask, _readMessagesTask);
}
catch(AggregateException) { }
Log.Info("stopping sessions");
_sessionsPendingStart.ForEach(DisposeOf);
ForEachSession(DisposeOf, throwIfCancellationRequested: false);
ProcessPendingRemoves();
DisposeOf(_cancellationTokenSource);
DisposeOf(_mainTask);
DisposeOf(_messageReader);
DisposeOf(_readMessagesTask);
DisposeOf(_pendingMessages);
DisposeOf(_sessionsPendingStart);
DisposeOf(_sessionsPendingRemove);
DisposeOf(_wakeUpMainTask);
Log.Info("stopped");
}