private void MainTask()
{
Log.Info("main task started");
try
{
var completedActiveSessions = false;
while(!_cancellationToken.IsCancellationRequested)
{
_wakeUpMainTask.Wait(_cancellationToken);
ProcessPendingRemoves();
if(!_pendingMessages.IsCompleted)
{
ProcessPendingMessages();
}
else if(!completedActiveSessions)
{
ForEachSession(session => session.CompleteAsync());
completedActiveSessions = true;
}
ProcessPendingStarts(_pendingMessages.IsCompleted);
}
}
catch(OperationCanceledException) { }
catch(Exception exc)
{
Log.Fatal(exc);
throw;
}
finally
{
Log.Info("main task stopped");
}
}