准确的说,soukey采摘此部分是参照了网上一个多线程的例子来设计的。这个例子设计的还是很完善的。在很多方面都做了考虑。
1、 首先建立一个采集任务的控制类,这个类主要的作用就是初始化一个采集任务管理器,同时负责响应界面发来的任务请求信息。这个类最大的作用是可以脱离界面进行后台采集任务的控制,如果没有这个类,采集任务的控制则需要界面来控制,建立了这个类之后,就可以完成采集任务的独立控制,便于将采集任务在后期扩展成为后台服务来运行。在soukey采摘中为:cGatherControl
2、 采集任务管理类(cGatherManage),这个类的作用是负责维护采集任务队列,同时响应队列中的每个采集任务反馈的信息,及控制每个采集任务的操作。既然是对采集任务队列的维护,所以,这个类必须初始化一个采集任务的队列,及采集任务数据集合。
3、 采集任务类(cGatherTask),即一个采集任务的控制类,包括数据初始化、数据分解(需根据此任务所需要执行的线程数进行分解)、动作控制、消息响应等。称其为控制类,是因为此类并不真正执行采集操作,而是控制任务分解后的子任务的操作,真正的采集工作有子任务来完成。
4、 子任务采集类(cGatherTaskSplit),此类是由采集任务类建立的,是soukey采摘中数据采集的最小单元,每一个子任务采集类都对应一个子任务数据实体类,根据子任务实体类的数据进行任务的采集。在此类中调用采集类(cGatherWeb)来完成数据的采集。需要了解的是,线程的建立也是在此类中完成。建立一个线程来执行数据的采集。同时反馈消息告诉采集任务类,此子任务已经开始执行。
Soukey采摘中消息的传递是通过事件来完成的。Soukey采摘中所需的事件在cGatherEvents.cs文件中进行定义,定义的事件有:任务状态改变事件、任务初始化事件、任务错误事件、线程错误事件、采集数据事件、采集日志事件、采集数量事件等。当子任务没完成一个网页的采集都会触发响应的事件将消息传递给任务管理类,再由任务管理类发送给界面,最终有界面类负责信息的响应。但在此需要注意,UI线程是不能由子线程直接进行调用,需要通过委托代理的方式进行。
当前soukey采摘多线程的制作还是很简单的,并且不是很完成,并没有实现线程间的通讯,同时也没有对线程进行过多的控制,当前对.net多线程的管理还不是很熟悉,此部分只能在后期逐步完善。