创新路
我们一直在努力

S先生任务成果源码 C#

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)
分享到:

评论 抢沙发

评论前必须登录!

天府云博 - 做有态度的开发&运维&设计学习分享平台!

联系我们百度云主机