多线程的死链测试,个别线程链接测试超时,请帮我看看代码
投稿人:zengdddd
- private void button1_Click(object sender, EventArgs e)
- {
- WebClient wc = new WebClient();
- string result = wc.DownloadString(textBox1.Text);
- Regex rx = new Regex(" <a\\s*[^ <>]*href\\s*=\\s*(\"?|\'?)(?'href'[^ <>\"\'\\s]*)(\"?|\'?)\\s*[^ <>]*>(?'text'((? <! </a>).)*) </a>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);
- MatchCollection mc = rx.Matches(result);
- dataGridView1.Rows.Clear();
- progressBar1.Maximum = mc.Count;
- progressBar1.Value = 0;
- for (int i = 0; i < mc.Count; i++)
- {
- string href = mc[i].Groups["href"].Value;
- string name = mc[i].Groups["text"].Value;
- if (href.IndexOf("http") == -1)
- {
- href = textBox1.Text + ((href.IndexOf("/") == 0) ? href : ("/" + href));
- }
- DataGridViewTextBoxCell link_name = new DataGridViewTextBoxCell();
- link_name.Value = name;
- DataGridViewTextBoxCell link_href = new DataGridViewTextBoxCell();
- link_href.Value = href;
- DataGridViewRow row = new DataGridViewRow();
- row.Cells.Add(link_name);
- row.Cells.Add(link_href);
- dataGridView1.Rows.Add(row);
- }
- Thread t = new Thread(new ParameterizedThreadStart(startTest));
- t.Start(dataGridView1.Rows);
- }
- private void startTest(object rows)
- {
- foreach (DataGridViewRow r in (DataGridViewRowCollection)rows)
- {
- Thread t = new Thread(new ParameterizedThreadStart(testLinks));
- t.Start(r);
- }
- }
- delegate void progressBarCallBack();
- private int dlinks=0,llinks=0;
- private void testLinks(object link)
- {
- DataGridViewRow row = (DataGridViewRow)link;
- try
- {
- HttpWebRequest req = (HttpWebRequest)WebRequest.Create(row.Cells[1].Value.ToString());
- req.Timeout = 10000;
- HttpWebResponse res = (HttpWebResponse)req.GetResponse();
- if (res.StatusCode == HttpStatusCode.OK)
- {
- row.Cells[2].Value = SEO.Resource1.yes;
- llinks += 1;
- }
- }
- catch(WebException ex)
- {
- row.Cells[2].Value = SEO.Resource1.no;
- dlinks += 1;
- }
- finally
- {
- if (progressBar1.InvokeRequired)
- {
- progressBarCallBack pCallBack = new progressBarCallBack(progressBar1.PerformStep);
- Invoke(pCallBack);
- }
- else
- {
- progressBar1.PerformStep();
- }
- if (progressBar1.Value == progressBar1.Maximum)
- {
- MessageBox.Show("链接状态检查完毕\n死链:" + dlinks + "条,正常链接:" + llinks + "条");
- }
- }
- }