예제 #1
0
        /*
         * 2017/2/21 11:00:54 DefaultTread中 清除验证码集合 出现异常: Type: System.InvalidCastException
         * Message: 无法将类型为“System.Collections.DictionaryEntry”的对象强制转换为类型“System.String”。
         * Stack:
         * 在 DigitalPlatform.LibraryServer.TempCodeCollection.CleanExpireItems()
         * 在 DigitalPlatform.LibraryServer.DefaultThread.Worker()
         *
         * */
        // 清除已经失效的那些事项
        public void CleanExpireItems()
        {
            List <string> remove_keys = new List <string>();

            // 读锁定并不阻碍一般性访问
            _lock.EnterReadLock();
            try
            {
                DateTime now = DateTime.Now;
                foreach (string key in this._table.Keys)
                {
                    TempCode code = (TempCode)this._table[key];
                    if (code == null || code.ExpireTime < now)
                    {
                        remove_keys.Add(key);   // 这里暂时无法删除,因为 foreach 还要用枚举器
                    }
                }
            }
            finally
            {
                _lock.ExitReadLock();
            }

            if (remove_keys.Count == 0)
            {
                return;
            }

            // 因为要删除某些元素,所以用写锁定
            _lock.EnterWriteLock();
            try
            {
                foreach (string key in remove_keys)
                {
                    // 和 hashtable 脱离关系
                    _table.Remove(key);
                }
            }
            finally
            {
                _lock.ExitWriteLock();
            }
        }
예제 #2
0
 public void SetTempCode(string strKey, TempCode code)
 {
     _lock.EnterWriteLock();
     try
     {
         if (_table.ContainsKey(strKey) == false)
         {
             // 即将增加
             if (_table.Count >= MaxItems)
             {
                 throw new Exception("TempCodeCollection 事项数目已经超出配额。请稍后再重试操作");
             }
         }
         _table[strKey] = code;
     }
     finally
     {
         _lock.ExitWriteLock();
     }
 }