Помогите заправить HttpWebRquest в c # - PullRequest
0 голосов
/ 23 декабря 2009

Привет, ребята, просто интересно, может ли кто-нибудь помочь мне попытаться правильно настроить потоки в моем приложении, я постоянно сталкиваюсь с препятствием, я никогда не задумывался о том, как создавать потоки в приложениях. Я пытался следовать этому http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/ учебнику.

В основном, я просто пытаюсь остановить мой запрос от зависания моего приложения

public class Twitter
{
    private const string _username = "****",
        _password = "****";

    private WebResponse webResp;

    public string getTimeLine()
    {
        Thread thread = new Thread(new ThreadStart(TwitterRequestTimeLine));
        thread.IsBackground = true;
        thread.Start();

        using (Stream responseStream = webResp.GetResponseStream())
        {
            //
            using (StreamReader reader = new StreamReader(responseStream))
            {
                return reader.ReadToEnd();
            }
        }
    }

    private void TwitterRequestTimeLine()
    {
        string aUrl = "http://168.143.162.116/statuses/home_timeline.xml";
        HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(aUrl);
        SetRequestParams(request);  
        request.Credentials = new NetworkCredential(_username, _password);
        //WebResponse tempResp = request.GetResponse();
        ThreadState state = new ThreadState();
        IAsyncResult result = request.BeginGetResponse(new AsyncCallback(???), ???);

    }



      private static void SetRequestParams( HttpWebRequest request )
  {
      request.Timeout = 500000;
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      request.UserAgent = "AdverTwitment";
  }
}
}

любая помощь будет очень ценна

Ответы [ 4 ]

8 голосов
/ 23 декабря 2009

Вам действительно не нужно создавать потоки HttpWebRequest.

Когда вы используете BeginGetResponse () и EndGetResponse () с HttpWebRequest, он уже использует фоновый поток для вас, чтобы работать асинхронно. Нет смысла вставлять это в фоновый поток.

Что касается использования: Справка для HttpWebRequest.BeginGetResponse демонстрирует полный асинхронный запрос.

2 голосов
/ 23 декабря 2009

Если это приложение WinForms, самый простой способ сохранить отзывчивость GUI при выполнении WebRequest - это использовать компонент BackgroundWorker. Удалите BackgroundWorker в своей форме и вызовите его метод RunWorkAsync (). Поместите код для выполнения WebRequest и прочитайте Ответ в обработчике событий DoWork.

0 голосов
/ 23 декабря 2009

Попробуйте использовать AsyncCallback, как предложил Рубенс, но сделайте вызов обратным вызовом в отдельный метод для загрузки данных по назначению. Если метод getTimeline не возвращается немедленно, это приведет к зависанию приложения, поскольку поток пользовательского интерфейса выполняет то, что выполняет сам запрос.

Если вы используете отдельный AsyncCallback, который вызывается после выполнения запроса, и он загружает данные, тогда метод будет возвращен немедленно, и ваш поток пользовательского интерфейса может делать другие вещи, пока он ждет.

0 голосов
/ 23 декабря 2009

Что по этому поводу:

private string getTimeLine()
{
    string responseValue = "";
    string aUrl = "http://168.143.162.116/statuses/home_timeline.xml";
    AutoResetEvent syncRequest = new AutoResetEvent(false);
    WebRequest request = WebRequest.Create(aUrl);
    request.Method = "POST";
    request.BeginGetResponse(getResponseResult =>
    {
        HttpWebResponse response = 
            (HttpWebResponse)request.EndGetResponse(getResponseResult);
        using (StreamReader reader = 
           new StreamReader(response.GetResponseStream()))
        {
            responseValue = reader.ReadToEnd();
        }

        syncRequest.Set();
    }, null);

    syncRequest.WaitOne();
    return responseValue;
}

EDIT : Хорошо, я пытался сохранить метод, возвращающий строку, поэтому я использовал AutoResetEvent; Если вы используете BackgroundWorker, вы получите уведомление, когда ваши данные будут доступны:

BackgroundWorker worker = new BackgroundWorker();
string responseValue = "";
worker.RunWorkerCompleted += (sender, e) =>
{
    // update interface using responseValue variable
};
worker.DoWork += (sender, e) =>
{
    string aUrl = "http://168.143.162.116/statuses/home_timeline.xml";
    WebRequest request = WebRequest.Create(aUrl);
    // .. setup
    using(StreamReader reader = 
      new StreamReader(request.GetResponse().GetResponseStream()))
        responseValue = reader.ReadToEnd();
};
worker.RunWorkerAsync();
...