public void Dispose() {
if (!_disposeToken.TryMarkDisposed()) {
return;
}
var sessions = GetSessions().ToList();
var stopHostTasks = sessions.Select(session => session.StopHostAsync());
try {
_services.Tasks.Wait(Task.WhenAll(stopHostTasks));
} catch (Exception ex) when (!ex.IsCriticalException()) { }
foreach (var session in sessions) {
session.Dispose();
}
Broker.Dispose();
}