/// <summary>
        /// Determines whether [is up to date] [the specified key].
        /// </summary>
        /// <param name="key">The key.</param>
        /// <param name="synchTicks">The synch ticks.</param>
        /// <returns></returns>
        public static ClusteredCachingSynchronizationStatus IsUpToDate(string key, out long synchTicks)
        {
            #region check whether we can delay the synchronization check
            if (ClusteredCacheController.CheckAtRequestIsUpToDateDelayInMilliseconds > 0 &&
                CheckAtRequestDependencies.ContainsKey(key) &&
                CheckAtRequestDependencies[key].LastChecked.HasValue &&
                CheckAtRequestDependencies[key].LastChecked.Value.AddMilliseconds(ClusteredCacheController.CheckAtRequestIsUpToDateDelayInMilliseconds) > DateTime.UtcNow)
            {
                synchTicks = CheckAtRequestDependencies[key].Ticks;
                return(ClusteredCachingSynchronizationStatus.UpToDate);
            }
            #endregion

            DataAccessManager dam = new DataAccessManager(ConnectionString);
            dam.AddInputParameter("@CacheKey", key);
            dam.AddInputParameter("@ApplicationId", ClusteredCacheController.ApplicationId);
            synchTicks = dam.ExecuteScalar <long>(GetFormattedStoredProcedureName(SP_SELECT));

            if (synchTicks <= 0)
            {
                return(ClusteredCachingSynchronizationStatus.RemovedFromCollection);
            }
            else
            {
                if (CheckAtRequestDependencies.ContainsKey(key))
                {
                    if (CheckAtRequestDependencies[key].Ticks.Equals(synchTicks))
                    {
                        if (ClusteredCacheController.CheckAtRequestIsUpToDateDelayInMilliseconds > 0)
                        {
                            CheckAtRequestDependencies[key] = GetCheckAtRequestInfo(synchTicks);
                        }

                        return(ClusteredCachingSynchronizationStatus.UpToDate);
                    }
                    else
                    {
                        return(ClusteredCachingSynchronizationStatus.OutOfDate);
                    }
                }
                else
                {
                    return(ClusteredCachingSynchronizationStatus.NotFound);
                }
            }
        }