/// <summary>
        /// 异步的,尝试通过表达式获取执行后的结果缓存。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="expression"></param>
        /// <param name="context"></param>
        /// <param name="creator"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        async Task <T> IExecuteCache.TryGetAsync <T>(Expression expression, ExecuteCacheContext context, Func <CancellationToken, Task <T> > creator, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var section = ConfigurationUnity.GetSection <TranslatorConfigurationSection>();
            var option  = section == null ? TranslateOptions.Default : section.Options;

            if (context.Enabled == true || (context.Enabled == null && option.CacheExecution))
            {
                TryExpire(expression);
            }

            var evaluator = _serviceProvider.TryGetService <IExecuteCacheEvaluator>();

            var result = CacheableChecker.Check(evaluator, expression);

            //没有开启数据缓存
            if ((result.Enabled == null && (context.Enabled == false || (context.Enabled == null && !option.CacheExecution))) ||
                result.Enabled == false || _cacheMgr == null)
            {
                return(await creator(cancellationToken));
            }

            var generator = _serviceProvider.TryGetService <IExecuteCacheKeyGenerator>(() => ExpressionKeyGenerator.Instance);
            var cacheKey  = _serviceProvider.GetCacheKey(generator.Generate(expression, CACHE_KEY));

            Tracer.Debug($"DefaultExecuteCache access to '{cacheKey}'");

            var segment = SegmentFinder.Find(expression);
            var pager   = segment as DataPager;

            using var edps = new EntityDeserializeProcessorScope();
            var cacheItem = _cacheMgr.TryGet(cacheKey,
                                             () => HandleCacheItem(cacheKey, expression, creator(cancellationToken).AsSync(), pager),
                                             () => new RelativeTime(GetExpire(result, option, context)));

            if (pager != null)
            {
                pager.RecordCount = cacheItem.Total;
            }

            TryStartRunner();

            return(cacheItem.Data);
        }
        private TimeSpan GetExpire(CacheableCheckResult checkResult, TranslateOptions option, ExecuteCacheContext cacheOpt)
        {
            if (checkResult.Expired != null)
            {
                return(checkResult.Expired.Value);
            }
            else if (cacheOpt.Times != null)
            {
                return(cacheOpt.Times.Value);
            }

            return(option.CacheExecutionTimes);
        }