第14行获得了读取的数据大小read,如果read>0说明数据可能还没有读完,所以在27行继续请求读下一个数据包;
如果read<=0说明所有数据已经接收完毕,这时rs.Html中存放了完整的HTML数据,就可以进行下一步的处理了。
第26行把这一次得到的字符串拼接在之前保存的字符串的后面,最后就能得到完整的HTML字符串。
然后说一下判断所有任务完成的处理
private void StartDownload()
{
_checkTimer = new Timer(new TimerCallback(CheckFinish), null, 0, 300);
DispatchWork();
}
private void CheckFinish(object param)
{
if (_workingSignals.IsFinished()) //检查是否所有工作实例都为Finished
{
_checkTimer.Dispose(); //停止定时器
_checkTimer = null;
if (DownloadFinish != null && _ui != null) //判断是否注册了完成事件
{
_ui.Dispatcher.Invoke(DownloadFinish, _index); //调用事件
}
}
}
第3行创建了一个定时器,每过300ms调用一次CheckFinish来判断是否完成任务。
第15行提供了一个完成任务时的事件,可以给客户程序注册。_index里存放了当前下载URL的个数。
该事件的定义是
public delegate void DownloadFinishHandler(int count);
/// <summary>
/// 全部链接下载分析完毕后触发
/// </summary>
public event DownloadFinishHandler DownloadFinish = null;
3. 保存页面文件
这一部分可简单可复杂,如果只要简单地把HTML代码全部保存下来的话,直接存文件就行了。
private void SaveContents(string html, string url)
{
if (string.IsNullOrEmpty(html)) //判断html字符串是否有效
{
return;
}
string path = string.Format("{0}{1}.txt", _path, _index++); //生成文件名
try
{
using (StreamWriter fs = new StreamWriter(path))
{
fs.Write(html); //写文件
}
}
catch (IOException ioe)
{
MessageBox.Show("SaveContents IO" + ioe.Message + " path=" + path);
}
if (ContentsSaved != null)
{
_ui.Dispatcher.Invoke(ContentsSaved, path, url); //调用保存文件事件
}
}
第23行这里又出现了一个事件,是保存文件之后触发的,客户程序可以之前进行注册。
public delegate void ContentsSavedHandler(string path, string url);
/// <summary>
/// 文件被保存到本地后触发
/// </summary>
public event ContentsSavedHandler ContentsSaved = null;










