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;
        }