2013-05-03 13 views
5

Wydaje się, że asynchroniczny wzorzec to wywołanie asynchroniczne, a następnie kontrola zysku po await wyniku, co ma wiele sensu.Jak "czekać" na żądanie WebClient.UploadStringAsync?

Jednak WebClient klasa UploadStringAsync metoda nie zwraca Task, zamiast tego powrócić unieważnione, a więc nie może być await ed. Zamiast tego można zdefiniować procedurę obsługi zdarzeń. na przykład

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

Jednak nie czeka na odpowiedź i zamiast tego szybko uruchamia maksymalną liczbę żądań internetowych.

Czy istnieje sposób na uzyskanie zwrotu z powrotem poza FlushQueue do czasu wykonania wywołania zwrotnego procedury obsługi zdarzenia?

Edytuj: To jest dla projektu Windows Phone 7.5.

Odpowiedz

7

Należy użyć UploadStringTaskAsync, który zwraca Task<string>.

Sufiksy asynchroniczne dla metod sprzed metody 4.5 są niefortunne, ponieważ nie pasują do sygnatur TAP, których można się spodziewać. W ogóle, w tej sytuacji zaleca, że ​​projektanci API używać TaskAsync zamiast Async jako przyrostek - czyli dokładnie to, co zrobił ... stąd WebClientDownloadStringTaskAsync itp

Można również rozważyć użycie HttpClient zamiast WebClient.

+0

Dzięki, to świetnie, obejrzeliśmy dokumenty dla "UploadStringTaskAsyc" i zwrócono "odpowiedź serwera" jako ciąg znaków, ale nie podano, jaki jest format ciągu - potrzebuję kodu repons HTTP, np. 200, czy muszę przeanalizować ten ciąg? – Brendan

+0

Czy teraz HttpClient jest preferowanym sposobem robienia tego typu rzeczy? Jest to pierwsze, o którym słyszałem ... Wyszukiwanie danych POST z Windows Phone zaowocowało WebClient, HttpWebRequest i innymi, ale nie HttpClient np. [ten artykuł MSDN] (http://msdn.microsoft.com/en-us/library/ff637320 (v = vs.95) .aspx # unsupported) i [ten artykuł MSDN] (http://msdn.microsoft. com/en-us/library/debx8sh9 (v = vs.90) .aspx). Czy istnieje dobre źródło informacji na temat najlepszych aktualnie przyjętych praktyk? – Brendan

+0

O ile mi wiadomo, 'HttpClient' na Windows Phone jest dostępny jako pakiet NuGet, ale nadal jest w wersji beta. Nie nazwałbym tego "preferowanym sposobem", ale "preferowanym sposobem";) Aby uzyskać więcej informacji: http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable-httpclient -for-net-framework-and-windows-phone.aspx –

Powiązane problemy