標籤:
設定思路: 採集目標: 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>(); //成功取得的美女圖片數量 public int ImgCount = 0;#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 = 0; 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); for (int i = 0; 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() { while (uUrls.Count > 0) { lblMsg.Text = string.Format("剩餘:{0},已訪問:{1},當前線程數:{2}", uUrls.Count, (OkUrls.Count + 1), threadslList.Count); string url = GetUrl(); if (url == "") { break; } else { if (GetHttpImg(url) == 200)//只有狀態200才是正常的, GetHttpImg是我封裝的方法, 擷取網頁, 正則取得所有合規範的圖片. { OkUrls.Add(url); lblInfoStart.Text = (int.Parse(lblInfoStart.Text) + 1).ToString(CultureInfo.InvariantCulture); WriteHtml(txtUrl.Text); if (lblC.Text == lblInfoStart.Text)//判斷當前數量是否已是總數. { lblMsg.Text = "完成"; } } } } } /// <summary> /// 線程加鎖,防止多個線程同時從list裡面取出第一個 /// </summary> /// <returns></returns> public string GetUrl() { lock ("GetUrl") { if (uUrls.Count > 0) { string url = uUrls[0]; uUrls.RemoveAt(0); return url; } else { return ""; } } }
winform採集網站美女圖片程式---多線程篇