public void Dispose()
{
if (wasDisposed)
return;
DisposeResourcesWhoseDisposalCannotFail();
if (monitor != null)
monitor.Dispose();
queueStorage.Dispose();
// only after we finish incoming recieves, and finish processing
// active transactions can we mark it as disposed
wasDisposed = true;
}