2009-12-23 2 views
0

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

в основном я просто пытаюсь остановить мою просьбу от виселицы моего приложения

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"; 
    } 
} 
} 

кто поможет бы значительно appricated

+0

Это веб-приложение или клиентское приложение, использующее веб-запрос HTTP? –

+0

Действительно ли запрос действительно работает? Отправляет ли он запрос и получает ответ? – glenatron

+0

Да, работа выполнена, у меня было все, что работает, это повесило приложение на некоторое время, пока оно не получило все. Также это настольное приложение –

ответ

2

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

8

Вы действительно не должны пронизывать HttpWebRequest.

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

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

-1

Что об этом:

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(); 
+0

Я пробовал это, это кажется быстрее, но все еще кажется, что мое приложение зависает и показывает «не отвечает» –

+1

Это просто упаковка асинхронного вызова в resetevent, чтобы сделать его синхронным. – Stephan

+0

Я пробовал отредактированную версию, и извините, если мне не хватает очевидного здесь, но как я могу отправить это обратно, чтобы обновить richtextbox в другой форме? извините, еще раз угадал, что потратил много времени, глядя на код сегодня –

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^