一直以来做的都是管理系统,虽然线程一直用到,但是一般都是为了在后台加载数据,更新数据,下载数据之类的操作,感觉对于速度和用户体验确实提高很多。
用线程的时候虽然知道有线程同步,线程安全之类的问题,但是一直没有遇到,也没有注意,结果最近的一个项目却遇到了。
最近副总要求做一个小脚本,请求不同的地址,通过传递参数打开不同的页面,只是需要做一个demo就可以。那么很简单,不超过50行js,没有配置文件,改了一个action。交给他一个html。当天提的需求,第二天就提交了,结果客户不满意。
版本二,需要同时打开三个页面,并且在三个页面之间切换,要求半天完成,好吧,看了下原本的系统,不能通过简单的修改一点代码完成,js不是很熟悉,需要查询比较多的资料。那么尝试用下批处理,没有结果。最后还是决定用C#做。通过使用几个COM组件,获取了浏览器的标签页,循环切换完成。不过超时了,当天没有完成,因为没人加班,所以第二天交给他。
明显会有版本三,需要加上配置文件,实现多组切换,自己控制时间。
明显有版本四,版本五,好吧,这么多年开发,总算是遇见需求变更这么频繁的了。而且不知不觉,竟然没有测试就上线了,那么问题就来了。
首先多个线程同时读取一个集合是没有关系的,但是同时Add和Remove的时候就会出错了。需要加上锁,加锁的时候这部分正好给了另一个同事,把两个线程执行的方法全锁了,最终只会执行一个方法,那么切换组合切换标签就只能执行一个了。
虽然很简单,只要报错了,就能直接改掉了,以后还是要注意,尽量这种简单的问题,第一次写代码的时候就处理掉。
关键的一点是,每个人提需求的是不一样的,还是应该谨慎,该怎么流程就怎么走,该要需求文档就必须提交,计划之类的都需要提前说明,应该自己掌握主动。
类似同时操作集合的方法是 list.Add();list.Remove();
类似加锁的
static void Main(string[] args)
{ Thread t1 = new Thread(OneToTen); Thread t2 = new Thread(HundredToTen); t1.Start(); t2.Start(); Console.Read(); } /// <summary> /// 无限执行输出100到109 /// </summary> private static void HundredToTen(object obj) { lock (c) { while (true) { for (int i = 100; i < 110; i++) { Console.WriteLine(i); } } } } /// <summary> /// 无限输出0到10 /// </summary> /// <param name="obj"></param> private static void OneToTen(object obj) { Thread.Sleep(10); lock (c) { while (true) { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } } } }