Example #1
0
        public void ScheduleRefresh(DurableCacheRefreshEvent refreshEvent)
        {
            var timer = new Timer
            {
                AutoReset = true,
                Interval  = refreshEvent.RefreshTime.TotalMilliseconds,
            };

            timer.Elapsed += (s, e) =>
            {
                _handler.Handle(refreshEvent);
                if (refreshEvent.UtcLifetime <= DateTime.UtcNow.Add(refreshEvent.RefreshTime))
                {
                    timer.Stop();
                }
            };

            timer.Start();

            if (!_timers.TryAdd(Guid.NewGuid(), timer))
            {
                Trace.TraceWarning("Unable to add timer to dictionary for key {0}", refreshEvent.Key);
            }
            ;
        }
        public void Handle(DurableCacheRefreshEvent refreshEvent)
        {
            try
            {
                var cache = string.IsNullOrWhiteSpace(refreshEvent.CacheName) ?
                    _container.Resolve<ICache>() :
                    _container.Resolve<ICache>(refreshEvent.CacheName);

                var bypassKey = refreshEvent.Method.DeclaringType.FullName + ".Intercept.Bypass";

                if (!_container.IsRegistered(refreshEvent.Method.Interface, bypassKey))
                {
                    //Wont work in the case of a custom factory or custom constructors
                    _container.RegisterType(refreshEvent.Method.Interface, refreshEvent.Method.DeclaringType, bypassKey);
                }

                var obj = _container.Resolve(refreshEvent.Method.Interface, bypassKey);

                var method = refreshEvent.Method.GetMethod();
                var value = method.Invoke(obj, refreshEvent.Parameters);

                if (method.IsGenericTask())
                {
                    var task = Task.Run(async () =>
                    {
                        await (dynamic)typeof(CacheExtensions).GetMethod("AddToCacheAsync")
                                .MakeGenericMethod(method.GetReturnType())
                                .Invoke(null, new object[] {cache, value,
                                    refreshEvent.Key, refreshEvent.UtcLifetime});
                    });

                    task.Wait();
                }
                else
                {
                    typeof(CacheExtensions).GetMethod("AddToCache")
                                .MakeGenericMethod(method.GetReturnType())
                                .Invoke(null, new object[] {cache, value,
                                    refreshEvent.Key, refreshEvent.UtcLifetime});
                }
            }
            catch (Exception ex)
            {
                Trace.TraceError("Unable to refresh cache for key {0}. Reason: {1}",
                    refreshEvent.Key,
                    ex.Message);
            }
        }
        public void ScheduleRefresh(DurableCacheRefreshEvent refreshEvent)
        {
            var timer = new Timer
            {
                AutoReset = true,
                Interval = refreshEvent.RefreshTime.TotalMilliseconds,
            };

            timer.Elapsed += (s, e) =>
            {
                _handler.Handle(refreshEvent);
                if (refreshEvent.UtcLifetime <= DateTime.UtcNow.Add(refreshEvent.RefreshTime))
                {
                    timer.Stop();
                }
            };

            timer.Start();

            if (!_timers.TryAdd(Guid.NewGuid(), timer))
            {
                Trace.TraceWarning("Unable to add timer to dictionary for key {0}", refreshEvent.Key);
            };
        }