Преобразование метода WebClient для async/wait
У меня есть код, который я переношу на Windows 8 WinRT. Код извлекает данные из URL-адреса, асинхронно вызывает переданный делегат:
private void RequestData(string uri, Action<string> action)
{
var client = new WebClient();
client.DownloadStringCompleted += (s,e) => action(e.Result);
client.DownloadStringAsync(new Uri(uri));
}
Преобразование в WinRT требует использования HttpClient
и асинхронных методов. Я прочитал несколько руководств по async/await, но немного озадачен. Как я могу изменить метод выше, но сохранить подпись метода, чтобы не изменять гораздо больше моего кода?
Ответы
Ответ 1
private async void RequestData(string uri, Action<string> action)
{
var client = new WebClient();
string data = await client.DownloadStringTaskAsync(uri);
action(data);
}
Смотрите: http://msdn.microsoft.com/en-us/library/hh194294.aspx
Ответ 2
Как я могу изменить метод выше, но сохранить подпись метода, чтобы не изменять гораздо больше моего кода?
Лучший ответ - "вы этого не делаете". Если вы используете async
, используйте его до конца.
private async Task<string> RequestData(string uri)
{
using (var client = new HttpClient())
{
return await client.GetStringAsync(uri);
}
}
Ответ 3
Следуя в этом примере, вы сначала создаете задачу async wtih, а затем получите его результат с помощью await
:
Task<string> downloadStringTask = client.DownloadStringTaskAsync(new Uri(uri));
string result = await downloadStringTask;
Ответ 4
var client = new WebClient();
string page = await client.DownloadStringTaskAsync("url");
или
var client = new HttpClient();
string page = await client.GetStringAsync("url");
Ответ 5
await
результат HttpClient.GetStringAsync Method:
var client = new HttpClient();
action(await client.GetStringAsync(uri));
Ответ 6
И этот кусок кода для UploadValuesAsync:
public class WebClientAdvanced : WebClient
{
public async Task<byte[]> UploadValuesAsync(string address, string method, IDictionary<string, string> data)
{
var nvc = new NameValueCollection();
foreach (var x in data) nvc.Add(x.Key, x.Value.ToStr());
var tcs = new TaskCompletionSource<byte[]>();
UploadValuesCompleted += (s, e) =>
{
if (e.Cancelled) tcs.SetCanceled();
else if (e.Error != null) tcs.SetException(e.Error);
else tcs.SetResult(e.Result);
};
UploadValuesAsync(new Uri(address), method, nvc);
var result = await tcs.Task;
return result;
}
}