public void Update(string id, T newObj)
        {
            AutoTimeoutObject <T> ato = null;
            long lastAccessedTime     = DateTime.UtcNow.ToFileTimeUtc();

            lock (_dict)
            {
                _dict.TryGetValue(id, out ato);
                if (ato != null)
                {
                    ato.Object            = newObj;
                    ato.CurrentAgeMillSec = 0;
                    ato.LastAccessTime    = lastAccessedTime;
                }
            }
        }
        public T Get(string id)
        {
            AutoTimeoutObject <T> ato = null;
            long lastAccessedTime     = DateTime.UtcNow.ToFileTimeUtc();

            lock (_dict)
            {
                _dict.TryGetValue(id, out ato);
                if (ato != null)
                {
                    ato.CurrentAgeMillSec = 0;
                    ato.LastAccessTime    = lastAccessedTime;
                }
            }

            return(ato?.Object);
        }
        public string Add(T obj, long maxAgeMillSec)
        {
            string id = Guid.NewGuid().ToString();
            AutoTimeoutObject <T> ato = new AutoTimeoutObject <T>()
            {
                Object            = obj,
                MaxAgeMillSec     = maxAgeMillSec,
                CurrentAgeMillSec = 0,
                LastAccessTime    = DateTime.UtcNow.ToFileTimeUtc()
            };

            lock (_dict)
            {
                _dict.Add(id, ato);
            }

            return(id);
        }
        public void Delete(string id)
        {
            AutoTimeoutObject <T> ato = null;

            lock (_dict)
            {
                _dict.TryGetValue(id, out ato);
                _dict.Remove(id);
            }

            if (ato?.Object != null)
            {
                lock (ato.Object)
                {
                    (ato.Object as IDisposable)?.Dispose();
                }
            }
        }