Tout le monde a eu tort jusqu'à présent, parce que BeginGetResponse()
effectue un travail sur le fil actuel. Du documentation :
La méthode BeginGetResponse nécessite quelques tâches de configuration synchrones pour (résolution DNS, détection de proxy et connexion de socket TCP, par exemple) avant que cette méthode ne devienne asynchrone. Par conséquent cette méthode ne doit jamais être appelée sur un thread d'interface utilisateur (IU) car cela pourrait prendre un temps considérable (jusqu'à plusieurs minutes (jusqu'à plusieurs minutes, selon les paramètres du réseau) pour effectuer les synchrones avant qu'une exception soit levée ou que la méthode réussisse. ne réussisse.
Donc pour faire ça bien :
void DoWithResponse(HttpWebRequest request, Action<HttpWebResponse> responseAction)
{
Action wrapperAction = () =>
{
request.BeginGetResponse(new AsyncCallback((iar) =>
{
var response = (HttpWebResponse)((HttpWebRequest)iar.AsyncState).EndGetResponse(iar);
responseAction(response);
}), request);
};
wrapperAction.BeginInvoke(new AsyncCallback((iar) =>
{
var action = (Action)iar.AsyncState;
action.EndInvoke(iar);
}), wrapperAction);
}
Vous pouvez ensuite faire ce que vous voulez de la réponse. Par exemple :
HttpWebRequest request;
// init your request...then:
DoWithResponse(request, (response) => {
var body = new StreamReader(response.GetResponseStream()).ReadToEnd();
Console.Write(body);
});
2 votes
Consultez cet article sur Developer Fusion : developerfusion.com/code/4654/asynchronous-httpwequest
0 votes
Vous pouvez également voir ce qui suit, pour un exemple assez complet de ce que Jason demande : stuff.seans.com/2009/01/05/ Sean
1 votes
Utiliser l'asynchronisme msdn.microsoft.com/fr/us/library/
1 votes
Pendant un moment, je me suis demandé si vous n'essayiez pas de commenter un fil récursif ?