/* * 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(); } }
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(); } }