webentwicklung-frage-antwort-db.com.de

Konvertieren einer WebClient-Methode nach async / await

Ich habe einen vorhandenen Code, den ich auf Windows 8 WinRT portiere. Der Code ruft Daten von der URL ab und ruft asynchron einen übergebenen Delegaten auf:

private void RequestData(string uri, Action<string> action)
{
  var client = new WebClient();
  client.DownloadStringCompleted += (s,e) => action(e.Result);
  client.DownloadStringAsync(new Uri(uri));
}

Die Konvertierung in WinRT erfordert die Verwendung von HttpClient und asynchronen Methoden. Ich habe ein paar Tutorials zu Async/Warten gelesen, bin aber etwas ratlos. Wie kann ich die obige Methode ändern, aber die Methodensignatur beibehalten, um zu vermeiden, dass viel mehr Code geändert wird?

34
ColinE
private async void RequestData(string uri, Action<string> action)
{
    var client = new WebClient();
    string data = await client.DownloadStringTaskAsync(uri);
    action(data);
}

Siehe: http://msdn.Microsoft.com/en-us/library/hh194294.aspx

83
Cole Cameron

Wie kann ich die obige Methode ändern, aber die Methodensignatur beibehalten, um zu vermeiden, dass viel mehr Code geändert wird?

Die beste Antwort ist "Sie nicht". Wenn Sie async verwenden, verwenden Sie es ganz nach unten.

private async Task<string> RequestData(string uri)
{
  using (var client = new HttpClient())
  {
    return await client.GetStringAsync(uri);
  }
}
9
Stephen Cleary

Nach in diesem Beispiel erstellen Sie zuerst die asynchrone Aufgabe mit und erhalten dann das Ergebnis mit await:

Task<string> downloadStringTask = client.DownloadStringTaskAsync(new Uri(uri));
string result = await downloadStringTask;
7
McGarnagle
var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");

oder

var client = new HttpClient();
string page = await client.GetStringAsync("url");
4
L.B

await das Ergebnis der HttpClient.GetStringAsync-Methode :

var client = new HttpClient();
action(await client.GetStringAsync(uri));
3
dtb