WindowsForms 20170823.rar
总体思路:
1、界面主线程:启动任务线程,通过ODBC读取EXCEL数据至ArrayList动态数组sA\sB\sIP
2、任务主线程:启动Monitor线程控制主界面显示进度
2、任务主线程:循环数组筛出C表,实例化为WebSite类实例写入sC,并写入Access数据库以便人工核对数据(耗时2秒主要花在写入过程,可以省略)
3、任务主线程:循环调用sC中对象的Start(1)方法获取IP,对象同时自我标记是否在我司IP中(每个对象会独立启动新线程异步查询IP,并将结果通知到主线程)
4、任务主线程:当发现所有对象返回结果之后,开始写入Access数据(3、4步骤耗时24秒)
5、任务主线程:循环调用sC中,是我司IP的对象的Start(2)方法获取网页状态(同样异步查询通知主线程)
6、任务主线程:所有对象返回结果之后,开始写入数据(5、6步骤消耗3秒),退出任务线程
难点分析:
1、 多线程应用最大的问题是资源争用。
最开始我尝试每初始化一个对象,该对象立即执行查询IP和网站可用性查询,并直接将结果写入文件EXCEL,但并发实在太大,导致写入会失败。又换成写入TXT,硬IO更高,读写锁会导致文件锁死。又换成ACCESS数据库,还是只能部分写入数据。
尝试优化成两步,先查询IP并写入,完成之后再查询网站状态并写入。还是偶发写入失败。
最终找到的解决方案:读写分离,多线程查询,返回所有结果之后通过单线程写入。程序90%的代码都在处理多线程之间的关系及数据写入,这个过程就花费了5个小时来探索,一共才用了6个小时。
2、 监控多线程数据执行过程。
最开始是每个对象执行完毕主动更新主界面数据,但执行非常频繁,导致主界面卡死。最终方案,对象执行完毕更新计数器,通过独立的监控进程,每秒根据计数器显示结果到主界面。虽然界面看起来简单,但花了很多功夫。
优化空间:
1、目前程序一次性启动所有符合条件的WebSite对象查询自己的IP和网站可用性,会直接将CPU占满,并没有设计多线程调度控制模块,可以增加此模块控制任务数以免宕机。
2、界面可增加进度条显示及源文件路径选择。
感想:
多线程开发又多了不少感悟。如果单线程写,我只要半小时,几十行代码。换成多线程就花了6个小时,最复杂部分却并不是核心功能代码…体会到要开发简单、易用的程序真不是想当然的觉得容易,为了结果化繁为简,过程就要化简为繁。
客官点个赞呗! (1)