Exemple #1
0
        /// <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();
                }
            }
        }
Exemple #2
0
 /// <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;  //可终止
 }
Exemple #3
0
        /// <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");
        }
Exemple #4
0
 /// <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; //不可终止
     }
 }