Skip to main content
 首页 » 编程设计

C# HTTPWebRequest 多线程

2024年02月03日2898°冷暖

我是线程新手。我正在尝试使用多线程发送 HTTP Web 请求,我无法实现我需要的。 我的要求是向数千个相同或不同的网站发送请求并解析我从 httpwebrequest 获得的响应。 在下面的代码中,我正在发送 2 个同时线程,我正在寻找十个同时线程。

namespace threading 
{ 
public partial class Form1 : Form 
{ 
    delegate string UrlFetcher(string url); 
 
    private void button1_Click(object sender, EventArgs e) 
    { 
        int i = 1; 
        UrlFetcher u = new UrlFetcher(Fetch); 
        UrlFetcher u = new UrlFetcher(Fetch1); 
        string pageURL = "http://www.google.com"; 
 
        while (i <= 1000) 
        { 
            u.BeginInvoke(pageURL, new AsyncCallback(AfterFetch), "this is state"); 
            i++; 
            u.BeginInvoke(pageURL, new AsyncCallback(AfterFetch1), "this is state"); 
            i++; 
            Thread.Sleep(5); 
        } 
    } 
 
    static string Fetch(string pageURL) 
    { 
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(pageURL); 
        WebReq.Method = "GET"; 
        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
        Stream Answer = WebResp.GetResponseStream(); 
        StreamReader _Answer = new StreamReader(Answer); 
        string myString = _Answer.ReadToEnd(); 
        return myString; 
    } 
 
    void AfterFetch(IAsyncResult result) 
    { 
        string a; 
 
        AsyncResult async = (AsyncResult)result; 
        UrlFetcher fetcher = (UrlFetcher)async.AsyncDelegate; 
        a = fetcher.EndInvoke(result).ToString(); 
 
        Regex regx = new Regex(@"<td>([A-Za-z0-9\-]+)\.(com|net)</td>", RegexOptions.IgnoreCase); 
        MatchCollection mactches = regx.Matches(a); 
        foreach (Match match in mactches) 
        { 
            string pattern = @"<(.|\n)*?>"; 
            string r = Regex.Replace(match.Value, pattern, string.Empty); 
            textBox3.AppendText(r); 
        } 
    } 
 
    static string Fetch1(string pageURL) 
    { 
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(pageURL); 
        WebReq.Method = "GET"; 
        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse(); 
        Stream Answer = WebResp.GetResponseStream(); 
        StreamReader _Answer = new StreamReader(Answer); 
        string myString = _Answer.ReadToEnd(); 
        return myString; 
    } 
 
    void AfterFetch1(IAsyncResult result) 
    { 
        string a; 
 
        AsyncResult async = (AsyncResult)result; 
        UrlFetcher fetcher = (UrlFetcher)async.AsyncDelegate; 
        a = fetcher.EndInvoke(result).ToString(); 
 
        Regex regx = new Regex(@"<td>([A-Za-z0-9\-]+)\.(com|net)</td>", RegexOptions.IgnoreCase); 
        MatchCollection mactches = regx.Matches(a); 
        foreach (Match match in mactches) 
        { 
            string pattern = @"<(.|\n)*?>"; 
            string r = Regex.Replace(match.Value, pattern, string.Empty); 
            textBox3.AppendText(r); 
        } 
    } 
} 
} 

如果有人能更正上面的代码,我们将不胜感激。

谢谢

请您参考如下方法:

我会说

  • 废除你的代表
  • 在循环中设置一个 WebRequest
  • 使用获取响应的异步版本 (Begin/End)GetResponse
  • 保持您的异步回调可重入(独立于任何实例状态)并使其使用“结束”调用的结果和您传入的任何状态(例如 WebRequest 本身)

这应该或多或少起作用