2009-12-23 5 views
0

Salut les gars, je me demandais si quelqu'un pouvait m'aider à essayer correctement mon fil d'application, je suis constamment à un obstacle après l'autre, je n'ai jamais été impliqué dans le filetage dans les applications. J'ai essayé de suivre ce tutoriel http://www.developerfusion.com/code/4654/asynchronous-httpwebrequest/.Aide threading HttpWebRquest en C#

fondamentalement, je suis juste essayer d'arrêter ma demande d'accrocher ma demande

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

aide quelqu'un serait grandement appricated

+0

S'agit-il d'une application Web ou d'une application cliente exploitant la requête Web HTTP? –

+0

La requête fonctionne-t-elle réellement? Est-ce qu'il envoie une demande et reçoit une réponse? – glenatron

+0

ouais la demande marche J'ai eu tout ce qui fonctionnait juste il a pendu l'application pendant un moment jusqu'à ce qu'il ait tout récupéré. Il s'agit également d'une application de bureau –

Répondre

2

S'il s'agit d'une application WinForms, le moyen le plus simple de répondre à l'interface graphique lors de l'exécution de WebRequest consiste à utiliser un composant BackgroundWorker. Déposez un BackgroundWorker sur votre formulaire et appelez sa méthode RunWorkAsync(). Mettez le code pour exécuter WebRequest et lisez la réponse dans le gestionnaire d'événements DoWork.

8

Vous avez vraiment pas besoin de fil HttpWebRequest. Lorsque vous utilisez BeginGetResponse() et EndGetResponse() avec HttpWebRequest, il utilise déjà un thread d'arrière-plan pour fonctionner de manière asynchrone. Il n'y a aucune raison de pousser cela dans un fil de fond. En ce qui concerne l'utilisation: L'aide pour HttpWebRequest.BeginGetResponse montre une requête complète et asynchrone.

-1

Qu'en est-ce:

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: Ok, j'ai essayé de garder une méthode retournant une chaîne, c'est pourquoi je AutoResetEvent; Si vous utilisez un BackgroundWorker, vous serez averti lorsque vos données sont disponibles:

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

J'ai essayé ceci, il semble plus rapide mais il semble toujours que mon application se bloque et montre "ne pas répondre" –

+1

C'est juste en enveloppant l'appel asynchrone dans un resetevent pour le rendre synchrone. – Stephan

+0

J'essaye la version éditée, et désolé si je manque l'évident ici mais comment est-ce que je ferais renvoyer ceci pour mettre à jour un richtextbox sur un formulaire différent? désolé encore une fois passé à consacrer beaucoup de temps à regarder le code aujourd'hui –

0

Essayez d'utiliser un AsyncCallback comme Rubens a suggéré, mais que l'appel de rappel dans une méthode distincte pour charger les données à sa destination. Si la méthode getTimeline ne renvoie pas immédiatement, l'application se bloque, car le thread UI est ce qui exécute la requête elle-même.

Si vous utilisez un AsyncCallback séparé pour être appelé après que la requête est terminée et qu'il charge les données, la méthode retournera immédiatement et votre thread d'interface utilisateur peut faire d'autres choses pendant qu'il attend.