// 主调程序 void DoCompare(object state) { // 统计总对比耗时用 var begin = DateTime.Now; // 数组第0个元素用于统计任务个数,在后面进行阻塞 // 数组第1个元素用于统计出错的行数 int[] taskCnt = { 0, 0 }; try { // 启动工作线程,去处理所有url int threadNum; if (!int.TryParse(txtThreadNum.Text, out threadNum)) { MessageBox.Show("请正确输入检查线程数"); return; } _scheduler.StartWork(threadNum); string compareIp = txtCompareIp.Text; string fileDir = Path.Combine(Utility.StartPath, "WebCompare\\" + DateTime.Now.ToString("yyyyMMddHHmmssfff")); object globalRegs = lnkReg.Tag; int idx = 0; int rowCnt = lvUrls.RowCount - 1; // 不处理未提交的行(即空白行) if (state != null) { int rowIdx = (int)state; if (rowIdx < 0 || rowIdx >= rowCnt) { return; } DataGridViewRow row = lvUrls.Rows[(int)state]; CompareRow(row, rowIdx + 1, compareIp, fileDir, globalRegs, taskCnt); } else { foreach (DataGridViewRow row in lvUrls.Rows) { if (row.Index >= rowCnt) { break; } idx++; CompareRow(row, idx, compareIp, fileDir, globalRegs, taskCnt); } } } catch (Exception exp) { string errMsg = string.Format("对比时出错,循环中止:\r\n{0}", exp); ShowCompareErr("", errMsg); } finally { // 等待所有线程完成 //while (_scheduler.QueueLength > 0) while (taskCnt[0] > 0) { Thread.Sleep(100); } _scheduler.StopWork(); SetReadOnly(false); string timeMsg = string.Format("全部对比完成,耗时:{0}秒,累计 {1} 个Url对比存在差异", (DateTime.Now - begin).TotalSeconds.ToString("N2"), taskCnt[1].ToString()); ShowCompareErr("", timeMsg); } }