设定思路: 采集目标: http://www.8kmm.com, 已知网址列表(List保存), 应用多线程(Thread)读取该列表, 获取url时不能重复(加锁Lock). 允许无序采集!
多线程核心代码:
#region 全局变量 //线程列表 List<Thread> threadslList = new List<Thread>(); //Url列表 List<string> uUrls = new List<string>(); //处理完毕的列表 List<string> OkUrls = new List<string>(); //成功取得的美女图片数量 ; #endregion //取图开始 按钮事件 private void lbtnGetWebImgStart_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { lbtnGetWebImgStart.Enabled = false; GetWebSiteImg(); } //取图停止 按钮事件 private void lbtnGetWebImgStop_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { try { foreach (Thread t in threadslList) { if (t != null) { t.Abort(); } } } catch (Exception ex) { WriteLog("停止失败:" + ex.Message); } finally { lbtnGetWebImgStart.Enabled = true; } } /// <summary> /// 获取图片主方法 /// </summary> private void GetWebSiteImg() { try { ImgCount = ; OkUrls.Clear(); uUrls.Clear(); threadslList.Clear(); //先初始化以上 string[] urls = txtUrl.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); lblC.Text = urls.Length.ToString(CultureInfo.InvariantCulture); uUrls = new List<string>(urls); ; i < int.Parse(numThreadUD.Text); i++) // 循环创建线程 { Thread t = new Thread(Task); t.Name = i.ToString(); t.IsBackground = true; threadslList.Add(t); t.Start(); } } catch (Exception ex) { WriteLog(ex.Message); } } public void Task() { ) { lblMsg.Text = ), threadslList.Count); string url = GetUrl(); if (url == "") { break; } else { )//只有状态200才是正常的, GetHttpImg是我封装的方法, 获取网页, 正则取得所有合规范的图片. { OkUrls.Add(url); lblInfoStart.Text = ().ToString(CultureInfo.InvariantCulture); WriteHtml(txtUrl.Text); if (lblC.Text == lblInfoStart.Text)//判断当前数量是否已是总数. { lblMsg.Text = "完成"; } } } } } /// <summary> /// 线程加锁,防止多个线程同时从list里面取出第一个 /// </summary> /// <returns></returns> public string GetUrl() { lock ("GetUrl") { ) { ]; uUrls.RemoveAt(); return url; } else { return ""; } } }