async public Task ManualUpdateAsync(IInstantProjectChecker instantChecker, Action <string> onProgressChange) { Trace.TraceInformation( String.Format("[GitClientUpdater] Processing manual update. Stored LatestChange: {0}. ProjectChecker: {1}", _latestChange.ToLocalTime().ToString(), (instantChecker?.ToString() ?? "null"))); if (instantChecker == null) { Trace.TraceError(String.Format("[GitClientUpdater] Unexpected case, manual update w/o instant checker")); Debug.Assert(false); return; } _updating = true; try { DateTime newLatestChange = instantChecker.GetLatestChangeTimestamp(); Trace.TraceInformation(String.Format("[GitClientUpdater] Repository Latest Change: {0}", newLatestChange.ToLocalTime().ToString())); // this may cancel currently running onTimer update await checkTimestampAndUpdate(newLatestChange, onProgressChange); } finally { _updating = false; } // if doUpdate succeeded, it is ok to start periodic updates if (!_subscribed) { Trace.TraceInformation(String.Format("[GitClientUpdater] Subscribe to Project Watcher")); _projectWatcher.OnProjectUpdate += onProjectWatcherUpdate; _subscribed = true; } }