2013-05-03 5 views
5

Das asynchrone Muster scheint asynchron zu sein, dann gibt die Steuerung nach await ein Ergebnis, was sehr sinnvoll ist.Wie erwartet man eine WebClient.UploadStringAsync-Anfrage?

jedoch die WebClient Klasse UploadStringAsync Methode liefert keine Task, es stattdessen void zurückgeben und so nicht await ziert werden kann. Stattdessen kann ein Event-Handler definiert werden. z.B.

public async Task FlushQueue() { 
    attempt = 0; 
    WebClient wc = new WebClient(); 
    while ((queue.Count > 0) && (attempt < ALLOWED_ATTEMPTS)) { 

     // Copy 10 items from queue and put into buffer ... 
     ... 
     wc.UploadStringCompleted += (s, e) => { 
      // if response 200 
      // Remove 10 sent items from queue 
      // else attempt++ 
     }; 
     wc.UploadStringAsync("http://example.com/blah", "POST", buffer); 

     // In an ideal world we could call UploadStringAsync like, 
     // var response = await wc.UploadStringAsync("http://example.com/blah", "POST", buffer); 
    } 
} 

Allerdings wartet dies nicht auf eine Antwort und stattdessen rasselt schnell durch die maximale Anzahl der Web-Anfragen.

Gibt es eine Möglichkeit, außerhalb von FlushQueue zurückzufließen, bis der Rückruf des Ereignishandlers ausgeführt wird?

Edit: Dies ist für ein Windows Phone 7.5 Projekt.

Antwort

7

Sie müssen UploadStringTaskAsync verwenden, die eine Task<string> zurückgibt.

Die Async-Suffixe auf Methoden vor 4.5 WebClient sind bedauerlich, da sie nicht mit den TAP-Signaturen übereinstimmen, die Sie erwarten würden. In der Regel in dieser Situation wird empfohlen, dass API-Designer verwenden TaskAsync anstelle eines Async als Suffix - das ist genau das, was WebClient ... tat daher DownloadStringTaskAsync usw.

Sie auch zu prüfen, mit HttpClient statt WebClient wollen könnte.

+0

Danke, das ist großartig, schaute auf die Dokumente für 'UploadStringTaskAsyc' und es gibt die 'Server-Antwort' als eine Zeichenfolge, aber nicht sagen, was ist das Format der Zeichenfolge - Ich brauche den HTTP-Antwortcode z. 200, muss ich diese Zeichenfolge analysieren? – Brendan

+0

Ist HttpClient jetzt auch der bevorzugte Weg, um so etwas zu tun? Dies ist der erste, den ich davon gehört habe ... Die Suche nach 'POST-Daten von Windows Phone' hat zu WebClient, HttpWebRequest und anderen, aber nicht zu HttpClient, z. [dieser MSDN-Artikel] (http://msdn.microsoft.com/en-us/library/ff637320 (v = vs.95) .aspx # nicht unterstützt) und [dieser MSDN-Artikel] (http://msdn.microsoft.com). com/de-de/library/debx8sh9 (v = vs.90) .aspx). Gibt es eine gute Quelle, um die aktuell besten Praktiken zu finden? – Brendan

+0

Soweit ich weiß, ist 'HttpClient' auf Windows Phone als NuGet-Paket verfügbar, befindet sich aber immer noch in der Beta-Version. Also würde ich es nicht "bevorzugten Weg" nennen, sondern "bevorzugten Weg";) Für weitere Informationen: http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient -for-net-framework-and-windows-phone.aspx –

Verwandte Themen