Attendre HttpWebRequest.BeginGetResponse pour finir dans Windows Phone 7
Je suis en train d'utiliser l'async HttpWebRequest
dans Silverlight pour Windows Phone. Tout fonctionne parfaitement jusqu'à ce que j'arrive à l'endroit où je devrais l'appeler
private static ManualResetEvent allDone = new ManualResetEvent(false);
...
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
allDone.WaitOne();
Debug.WriteLine("All done!");
Dans GetResponseCallback
:
private void GetResponseCallback(IAsyncResult asynchronousResult)
{
try
{
request = (HttpWebRequest)asynchronousResult.AsyncState;
response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
allDone.Set();
}
catch (Exception e)
{
Debug.WriteLine("Got Exception in GetResponseCallback: " + e.Message);
}
}
Après l'appel à allDone.WaitOne();
se bloque...
Toutes les suggestions sur les pourquoi?
Ce thread est-ce?
C'est dans le thread principal
C'est dans le thread principal
OriginalL'auteur greve | 2010-10-28
Vous devez vous connecter pour publier un commentaire.
Cela prend juste un peu de changement dans la pensée, loin de blocage/attente de la pensée en async conditions sur le WP7 plate-forme. Le résultat est que l'utilisateur est toujours en mesure d'interagir avec l'INTERFACE utilisateur.
Déplacer un appel à votre code d'achèvement (writeline dans ce cas) dans votre CompletedEventHandler et pour toutes les mises à jour de l'INTERFACE utilisateur marshall retour vers le thread d'INTERFACE utilisateur avec
S'il y a des éléments d'INTERFACE utilisateur qui ne doit pas être en interaction avec tout votre async op est de l'exécution de ces contrôles peuvent être masqués ou désactivé pour les intermédiaires.
OriginalL'auteur Mick N
Pour être honnête, ce n'est pas une bonne idée. Avoir de l'attente sur-le-main (UI) thread permet de verrouiller le téléphone et créez-en un qui ne répond pas de l'INTERFACE utilisateur. Ça va être mieux dans le long terme, pas pour lutter contre le réseau asynchrone accès dans WP7 et Silverlight, le code peut être plus complexe dans les lieux et vous finissez par avoir beaucoup de méthodes qui prennent des blagues, mais avoir le plus de réponse de l'INTERFACE utilisateur est mieux que d'avoir le verrouiller en place.
OriginalL'auteur Nigel Sampson
J'ai rencontré le même problème mais est résolu lorsque j'ai remplacé le WP7 image avec un nouveau. Déverrouillé image sera la cause de ce problème.
OriginalL'auteur Mahendar
Il semble être une limitation de l'émulateur. Je n'ai pas essayé encore, mais je crois que l'exécution de ce sur un unlocked wp7 émulateur devrait faire l'affaire. http://forum.xda-developers.com/showthread.php?p=11148176#post11148176
OriginalL'auteur chris
Notez également que si le ManualResetEvent ne se produit jamais cet appel à WaitOne ne reviendra jamais:
http://msdn.microsoft.com/en-us/library/bb299385.aspx
OriginalL'auteur Dan Colasanti
Vous voudrez probablement aller
allDone.Set()
à l'extérieur de latry..catch
. Sinon, l'événement ne sera jamais réglé que si il y a une exception et le fil qui a commencé l'opération asynchrone va s'accrocher. Qui est, vous voulez écrire:response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
OriginalL'auteur Jim Mischel