线程安全的Generic Dictionary
来源:互联网 发布:网络电视狗 编辑:程序博客网 时间:2024/05/21 11:07
System.Collections.Generic.Dictionary<,>
只要不修改该集合,Dictionary 就可以同时支持多个阅读器。即便如此,从头到尾对一个集合进行枚举本质上并不是一个线程安全的过程。当出现枚举与写访问互相争用这种极少发生的情况时,必须在整个枚举过程中锁定集合。若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。今天解决了使用Dictionary泛型类的时候出现一个错误 “System.InvalidOpervationExcepti
private void CheckingTimeout()
{
List<string> list = new List<string>();
lock (sessions)
{
foreach (string sessionKey in sessions.Keys)
{
if (sessions[sessionKey].IsTimeouted)
{
logger.Info("会话 [" + sessionKey + "] 超时");
UnLoadSession(sessionKey);
list.Add(sessionKey);
}
}
foreach (string key in list)
{
sessions.Remove(key);
}
}
}
public void UnloadSession(string sessionID)
{
lock (sessions)
{
if (sessions.ContainsKey(sessionID))
{
db.Delete(GetSessionFromDatabase(sessionID));
dispatcher.UnregisterAllOutEventSubscriber(sessionID);
sessions.Remove(sessionID);
}
}
}
{
List<string> list = new List<string>();
lock (sessions)
{
foreach (string sessionKey in sessions.Keys)
{
if (sessions[sessionKey].IsTimeouted)
{
logger.Info("会话 [" + sessionKey + "] 超时");
UnLoadSession(sessionKey);
list.Add(sessionKey);
}
}
foreach (string key in list)
{
sessions.Remove(key);
}
}
}
public void UnloadSession(string sessionID)
{
lock (sessions)
{
if (sessions.ContainsKey(sessionID))
{
db.Delete(GetSessionFromDatabase(sessionID));
dispatcher.UnregisterAllOutEventSubscriber(sessionID);
sessions.Remove(sessionID);
}
}
}
错误出现的原因是代码中在枚举的过程中修改了集合,而造成了这个错误,修改后的代码如下:
private void CheckingTimeout()
{
List<string> list = new List<string>();
lock (sessions)
{
foreach (string sessionKey in sessions.Keys)
{
if (sessions[sessionKey].IsTimeouted)
{
logger.Info("会话 [" + sessionKey + "] 超时");
UnregisterSession(sessionKey);
list.Add(sessionKey);
}
}
foreach (string key in list)
{
sessions.Remove(key);
}
}
}
private void UnregisterSession(string sessionID)
{
lock (sessions)
{
if (sessions.ContainsKey(sessionID))
{
db.Delete(GetSessionFromDatabase(sessionID));
dispatcher.UnregisterAllOutEventSubscriber(sessionID);
}
}
}
{
List<string> list = new List<string>();
lock (sessions)
{
foreach (string sessionKey in sessions.Keys)
{
if (sessions[sessionKey].IsTimeouted)
{
logger.Info("会话 [" + sessionKey + "] 超时");
UnregisterSession(sessionKey);
list.Add(sessionKey);
}
}
foreach (string key in list)
{
sessions.Remove(key);
}
}
}
private void UnregisterSession(string sessionID)
{
lock (sessions)
{
if (sessions.ContainsKey(sessionID))
{
db.Delete(GetSessionFromDatabase(sessionID));
dispatcher.UnregisterAllOutEventSubscriber(sessionID);
}
}
}
- 线程安全的Generic Dictionary
- 线程安全的数据字典Dictionary
- XML Serializable Generic Dictionary
- XML Serializable Generic Dictionary
- w3wp占用CPU过高的解决过程(Dictionary和线程安全)
- 记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)
- C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全
- 巧用Dictionary对象实现线程安全类(实例)
- C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全
- C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全
- C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全
- C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全
- C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全
- C#集合类(HashTable, Dictionary, ArrayList)与HashTable线程安全
- 线程安全非线程安全的区别
- java的线程安全
- 线程安全的SyncArrayList
- 线程的安全删除
- VS 2005 TFS MSSCCI Provider
- 学习.net 2.0需要讲究一下策略
- IBatisNet 开发指南系列文章更新
- .Net脚本语言Boo简介
- 程序员经典书籍推荐
- 线程安全的Generic Dictionary
- AggregateCacheDependency、CacheDependency、SqlCacheDependency Asp.net 2.0和Sql Server的缓存管理和使用ObjectBuilder改造PetShop4 的缓存示例
- RHCE视频教程 RH033读书笔记 - UNIT 1 - Overview(概述)
- 负载均衡环境下缓存处理
- 机主每天接上百个找郑伊健的电话
- IBATISNETNET 1.3 开发指南系列文章
- 微软推出SQL Server 2005 Report Packs
- mono 最近的三条消息
- 商务智能:SQL2005给我们的机会