Dictionary无法删除

varlj 2016-01-28 10:04:01
我使用Dictionary来保存Socket与一些业务信息的关联,当客户断开连接后,我需要从Dictionary把它删除掉,结果发现删除不掉,代码如下:


//用于存放SOCKET与关联的信息
static IDictionary<Socket, SomeInfo> dic = new Dictionary<Socket, SomeInfo>();

//删除的代码,放在一个timer中,1秒检查一次
for(int i=0;i<list.Count;i++)
{
var socket = list[i];

Console.WriteLine(socket.Handle);
socket.Disconnect(false);
Console.WriteLine("before:" + dic.ContainsKey(socket) + " count:" + dic.Keys.Count);
Console.WriteLine( dic.Remove(socket) );
Console.WriteLine("after:" + dic.ContainsKey(socket) + " count:" + dic.Keys.Count);
}


输出结果:
1228
before:True count:1
True
after:False count:1

1228
before:True count:1
True
after:False count:0

1228
before:True count:1
True
after:True count:1

1228
before:True count:1
True
after:False count:0

1228
before:True count:1
True
after:True count:1

1228
before:True count:1
True
after:True count:1
...全文
479 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-01-28
  • 打赏
  • 举报
回复
Dictionary 不是线程安全的! 多线程时慎用
varlj 2016-01-28
  • 打赏
  • 举报
回复
引用 9 楼 asia217 的回复:
多线程的问题 ConcurrentDictionary 解决,删除方法不是remove 好像是tryde。。。。
给客户用的开发包,.NET版本没敢选太高,没有ConcurrentDictionary
varlj 2016-01-28
  • 打赏
  • 举报
回复
谢谢各位,让我找到解决思路 基本上来说,确实可以算是多线程引起的 因为我是使用SOCKET的异步方法,把beginAccept方法放错了位置,而BeginAccept方法是会把socke当参数传进去的,这样就导致同一个socket删除了又加上,表现在输出上就是Dictionary怎么也删除不了。
白衣如花 2016-01-28
  • 打赏
  • 举报
回复
是否多线程? 我出现过一个奇怪的现象,Dictionary<int, byte[]>的key是一个非0集合,表示socket的需要重发的数据 receivecallback发现对面已接收并返回key,则移除字典中的项 一段时间过后,发现字典有很都key为0的项,不得其解 add和remove时加锁,上述现象解决
asia217 2016-01-28
  • 打赏
  • 举报
回复
多线程的问题 ConcurrentDictionary 解决,删除方法不是remove 好像是tryde。。。。
  • 打赏
  • 举报
回复
忽略5楼的回复,这是因为你是多线程导致的并发问题吧 如果你是4.0以上,可以考虑用
System.Collections.Concurrent.ConcurrentDictionary<TKey, TValue>
  • 打赏
  • 举报
回复
有socket.Handle,为什么你不用这个int做key呢?或者你new Dictionary时传入自己实现的IEqualityComparer<TKey>接口,内部用socket.Handle来进行比较,这样就能移除了
全栈极简 2016-01-28
  • 打赏
  • 举报
回复
if(dic.ContainsKey(socket)) { dic.Remove(socket); } 我做了个测试是可以删除的。
江南小鱼 2016-01-28
  • 打赏
  • 举报
回复
移除之前你用ContainsKey判断下,你指定的Key在字典是否存在? 如果判断结果是false,那就是你添加字典的时候有问题咯。 Dictionary<TKey, TValue>.Remove key不会null,是不会报错的。
varlj 2016-01-28
  • 打赏
  • 举报
回复
引用 1 楼 guwei4037 的回复:
我没看到Dictionary.Remove方法移除的代码。
代码第12行
全栈极简 2016-01-28
  • 打赏
  • 举报
回复
我没看到Dictionary.Remove方法移除的代码。
varlj 2016-01-28
  • 打赏
  • 举报
回复
引用 12 楼 xuzuning 的回复:
Dictionary 不是线程安全的! 多线程时慎用
嗯,加锁了,而且由于业务的特殊性,其实不加锁也没什么问题

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧