C # HTTPWebRequest Многопоточность - PullRequest
1 голос
/ 10 октября 2010

Я новичок в потоках.Я пытаюсь отправить HTTP веб-запрос, используя многопоточность, я не могу получить то, что мне нужно.Мое требование состоит в том, чтобы отправить запрос на тысячи одинаковых или разных веб-сайтов и проанализировать ответ, полученный от 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);
        }
    }
}
}

Если кто-то исправит приведенный выше код, это действительно приветствуется.1006 *

1 Ответ

5 голосов
/ 10 октября 2010

Я бы сказал

  • Отмените вашего делегата
  • Настройка веб-запроса в цикле
  • Используйте асинхронную версию Получение ответа (Begin/End)GetResponse
  • Сохраните свой повторяющийся асинхронный обратный вызов (независимо от состояния экземпляра) и заставьте его использовать результат вызова "End" и любое состояние, которое вы передаете (например, сам WebRequest)

Это должно более или менее работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...