public Task <bool> Begin() { if (1 == Interlocked.CompareExchange(ref _started, 1, 1)) { throw new InvalidDataException("Can't start the processor twice"); } Utils.Log("Starting Installer Task"); return(Task.Run(async() => { try { Utils.Log("Installation has Started"); _isRunning.OnNext(true); var task = await _Begin(_cancel.Token); Utils.Log("Vacuuming databases"); HashCache.VacuumDatabase(); VirtualFile.VacuumDatabase(); Utils.Log("Vacuuming completed"); return task; } catch (Exception ex) { var _ = Metrics.Error(this.GetType(), ex); throw; } finally { _isRunning.OnNext(false); } })); }