HttpWebRequest.BeginGetResponse
J'ai besoin de faire de demande asynchrone de ressources sur le web et utiliser l'exemple de cette page (lien exemple):
HttpWebRequest myHttpWebRequest= (HttpWebRequest)WebRequest.Create("http://www.contoso.com");
RequestState myRequestState = new RequestState();
myRequestState.request = myHttpWebRequest;
//Start the asynchronous request.
IAsyncResult result=
(IAsyncResult) myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback),myRequestState);
Mais quand je suis en train de tester l'application à l'exécution de gel(sur 2-3 sec) sur la dernière ligne de ce code (je peux le regarder à l'aide du débogueur).
Pourquoi? Est-ce de ma faute ou c'est un comportement normal de la fonction?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer, je suis sûr que c'est mieux
En raison de chross fil de la zone de texte'value,Mais c'est l'application wpf, je vais re-tagger ce, btw, vous pouvez utiliser le client web comme
La réponse se produit sur un thread séparé. Winforms ne sont pas multi-thread-safe, vous allez avoir à l'envoi de l'appel sur le même thread que la forme.
Vous pouvez le faire à l'aide de la boucle de message interne de la fenêtre. Heureusement, .NET fournit un moyen pour ce faire. Vous pouvez utiliser le contrôle de l'Appeler ou BeginInvoke méthodes pour ce faire. L'ancien bloque le thread courant jusqu'à ce que le thread d'INTERFACE utilisateur complète la méthode invoquée. Le plus tard fait de façon asynchrone. À moins qu'il existe de nettoyage à faire, vous pouvez utiliser ce dernier afin de "fire and forget"
Pour que cela fonctionne, de toute façon, vous aurez besoin de créer une méthode qui est appelé par BeginInvoke, et vous aurez besoin d'un délégué à point à cette méthode.
Voir Contrôle.Invoquer et de Contrôle.BeginInvoke dans la MSDN pour plus de détails.
Il y a un exemple sur ce lien: https://msdn.microsoft.com/en-us/library/zyzhdc6b(v=vs. 110).aspx
Mise à jour: Comme je suis parcourant mon profil parce que j'avais oublié que j'avais un compte ici - je l'ai remarqué et je me dois d'ajouter: Rien passé de 3,5 ou quand ils ont changé de manière significative l'asynchrone modèle de thread ici est hors de ma cabine de pilotage. Je suis professionnel, et pendant que j'ai encore de l'amour du métier, je n'ai pas suivi tous les avancements. Ce que je peux vous dire, c'est ce devrait fonctionne dans toutes les versions de .NET, mais il peut ne pas être l'apogée de la performance 4.0 et au-delà ou sur Mono/Winforms émulation si c'est toujours autour de. Sur le côté positif, de la frappe en général ne sont pas mauvais à l'extérieur de serveur d'applications, et même à l'intérieur si le pool de threads est en train de faire son travail. Afin de ne pas concentrer les efforts d'optimisation ici dans la plupart des cas, et il est plus susceptible de travailler sur "dépouillé" plates-formes vous voyez des choses en cours d'exécution comme le C# de forfaits mobiles bien que je dois regarder pour être sûr et la plupart ne fonctionnent pas winforms, mais tourner les boucles de messages et cela fonctionne aussi. Essentiellement à la ligne de fond, ce n'est pas la "meilleure réponse" pour les nouvelles plates-formes dans chaque cas. Mais il pourrait être plus portable dans le bon cas. Si ça peut aider une personne à éviter de faire une erreur de conception, alors ça valait le coup le temps que j'ai pris pour écrire ce. =)
Vous pouvez utiliser le composant BackgroundWorker ajouter faire la même chose à DoWork
C'est le comportement standard.
De la documentation sur HttpWebRequest.BeginGetResponse Méthode:
Pour éviter l'attente pour le programme d'installation, vous pouvez utiliser
HttpWebRequest.BeginGetRequestStream Méthode
mais sachez que: