private void Execute() { DateTime now = DateTime.Now; if (monitors.Count > 0) { using (SPSite site = new SPSite(siteId, SPUserToken.SystemAccount)) { List <SPChange> collection = new List <SPChange>(); SPChangeQuery query = CreateQuery(lastCheckTime); SPChangeCollection result = site.GetChanges(query); while (result.Count > 0) { collection.AddRange(result.OfType <SPChange>()); query.ChangeTokenStart = result.LastChangeToken; result = site.GetChanges(query); } if (collection.Count > 0) { Dictionary <Tuple <Type, object>, SPAggregatedChange> dictionary = new Dictionary <Tuple <Type, object>, SPAggregatedChange>(); foreach (SPChange item in collection) { SPAggregatedChange record = dictionary.EnsureKeyValue(Tuple.Create(item.GetType(), SPChangeMonitor.GetUniqueKey(item))); record.Add(item); } foreach (SPChangeMonitor monitor in monitors) { monitor.ProcessChanges(dictionary.Values); } } } } lastCheckTime = now; }