C# 公共 Hashtable 变量在一个 System.Timers.Timer 中能改变值,但是 remove 后,下次为什么还有啊?

2015-04-09 16:01:29 +08:00
 luent
变量: public volatile static Hashtable M_Status = Hashtable.Synchronized(new Hashtable());
太诡异了,郁闷啊!
2289 次点击
所在节点    问与答
4 条回复
caoyue
2015-04-09 17:36:25 +08:00
贴个完整点的代码比较方便看问题吧=-=
dong3580
2015-04-09 17:52:08 +08:00
static
dong3580
2015-04-09 18:10:18 +08:00
抱歉回复错了:
System.Timers.Timer 还没执行已经输出结果了,也就是hashtable还没移除键值对,已经输出结果了。
可以加个睡觉1s就正常。

#####写个简单的eg:

''' C#
public static Hashtable M_Status= Hashtable.Synchronized(new Hashtable());
static void Main(string[] args)
{
M_Status = Hashtable.Synchronized(new Hashtable());
M_Status.Add("a", "a");
M_Status.Add("b", "b");
Timer t = new Timer();
t.Elapsed += t_Elapsed;
t.Start();
//System.Threading.Thread.Sleep(1000);
Console.Write(M_Status.Count.ToString());
Console.ReadLine();
}

static void t_Elapsed(object sender, ElapsedEventArgs e)
{
M_Status.Remove("a");
}
'''
hiro0729
2015-04-10 00:06:56 +08:00
Timer 的本质是线程啊,t.Start()开始一个新线程。也就是说,t.Start()并不一定是马上执行的,需要看系统对线程的分配。

//System.Threading.Thread.Sleep(1000);强制睡眠当前线程时,新线程肯定就能运行了,能正确删除a。
如果在Console.Write(M_Status.Count.ToString());之前没有大量耗时运算或切换线程的操作的话,大概率是Timer的事件还没运行,这边就已经运行结束了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/182602

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX