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?
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
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);
}
}
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;
var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");
oder
var client = new HttpClient();
string page = await client.GetStringAsync("url");
await
das Ergebnis der HttpClient.GetStringAsync-Methode :
var client = new HttpClient();
action(await client.GetStringAsync(uri));