/// <summary> /// 开始执行跑数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnGO_Click(object sender, EventArgs e) { if (btnGO.Text == "继续") { EventHandle.Set(); btnGO.Enabled = false; //继续按钮可用 btnGO.Text = "继续"; btnPause.Enabled = true; //可暂停 btnAbort.Enabled = true; //可以终止 } else { ThreadPools.Clear(); btnGO.Enabled = false; //开始按钮不可用 btnPause.Enabled = true; //可暂停 btnAbort.Enabled = true; //可以终止 ThreadNum = (int)numDownThread.Value; ThreadSleep = (int)numDownMs.Value; //获取产品 List <Parameter> ps = GetParams(); //给待执行的总数赋值,好计算线程是否执行完毕 TodoCount = ps.Count; //计算每个线程需要跑的数量,遇到小数进1 int PageSize = (int)Math.Ceiling(ps.Count * 1.0 / ThreadNum); //根据数据和线程数构造线程池和数据 for (int i = 0; i < ThreadNum; i++) { List <Parameter> para = ps.GetPageDataByIndex(i + 1, PageSize); if (para.Count > 0) { string thName = $"{i + 1}"; Thread thread = new Thread(() => DoIt(para, thName)) { Name = thName }; ThreadPools.Add(thread); } else { break; } } //初始化基本信息 ListBoxHelp.Clear(lbRes); lblCopyMsg.Text = ""; //呈现线程信息 ListBoxHelp.Add(lbRes, $"{DateTime.Now.CnTime()}|共匹配{ps.Count}条数据,线程数:{ThreadPools.Count},每个线程:{PageSize}条数据" + "\r\n"); lbMsg.Text = string.Format("找到{0}批次数据", ps.Count); //Start thread foreach (var th in ThreadPools) { th.Start(); } } }
/// <summary> /// 线程暂停 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnPause_Click(object sender, EventArgs e) { //暂停信号量 EventHandle.Reset(); ListBoxHelp.Add(lbRes, $"{DateTime.Now.CnTime()}|已暂停" + "\r\n"); btnGO.Enabled = true; //继续按钮可用 btnGO.Text = "继续"; btnPause.Enabled = false; //不可暂停 btnAbort.Enabled = true; //可终止 }
/// <summary> /// 抓网页数据核心方法 /// </summary> /// <param name="pros"></param> /// <param name="threadName"></param> public void DoIt(List <Parameter> pros, string threadName) { ListBoxHelp.Add(lbRes, $"{DateTime.Now.CnTime()}|thread-{threadName} start..." + "\r\n"); string TempUrl = txtURL.Text.Trim(); for (int i = 0; i < pros.Count; i++) { //接收信号量,否则会阻塞达到暂停的目的 EventHandle.WaitOne(); //http HttpUtility http = new HttpUtility(); StringBuilder sb = new StringBuilder(); StringBuilder sbLog = new StringBuilder(); //获取参数 Parameter para = pros[i]; //计时开始 Stopwatch sw = new Stopwatch(); sw.Start(); sb.AppendFormat("{0}", DateTime.Now.CnTime()); //根据参数重新匹配http url string url = GenerateFullURL(TempUrl, para.Param); //请求http string value = TextHelper.ClearSpace(http.CreateGet(url)); sw.Stop(); sb.AppendFormat("|thread-{0}({1}/{2})serid:{3}|url:{4}", threadName, i + 1, pros.Count, para.Id, url); sb.AppendFormat("|times:{0}s", sw.ElapsedMilliseconds * 1.0 / 1000); sbLog.AppendFormat("serid:{0},{1}", para.Id, value); //TextHelper.ClearHtml(value) ListBoxHelp.Add(lbRes, sb.ToString() + "\r\n"); LogHelper.WriteLog(sbLog.ToString()); //最后一次不sleep了 if (i < pros.Count) { Thread.Sleep(ThreadSleep); } //执行完毕后计数 CalculatedQuantity(); } ListBoxHelp.Add(lbRes, $"{DateTime.Now.CnTime()}|thread-{threadName} finished!" + "\r\n"); }
/// <summary> /// 线程终止 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnAbort_Click(object sender, EventArgs e) { try { foreach (Thread t in ThreadPools) { t.Abort(); } } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { ThreadPools.Clear(); EventHandle.Set(); ListBoxHelp.Add(lbRes, $"{DateTime.Now.CnTime()}|已终止线程。" + "\r\n"); btnGO.Enabled = true; //开始按钮可用 btnGO.Text = "开始"; btnPause.Enabled = false; //不可暂停 btnAbort.Enabled = false; //不可终止 } }