DownloadStringAsync ожидает завершения запроса
Я использую этот код для получения содержимого URL:
private ArrayList request(string query)
{
ArrayList parsed_output = new ArrayList();
string url = string.Format(
"http://url.com/?query={0}",
Uri.EscapeDataString(query));
Uri uri = new Uri(url);
using (WebClient client = new WebClient())
{
client.DownloadStringAsync(uri);
}
// how to wait for DownloadStringAsync to finish and return ArrayList
}
Я хочу использовать DownloadStringAsync
так как DownloadString
зависает графический интерфейс приложения, но я хочу иметь возможность вернуть результат на request
, Как я могу ждать, пока DownloadStringAsync
закончить запрос?
6 ответов
Почему вы хотите подождать... это заблокирует графический интерфейс, как и раньше!
var client = new WebClient();
client.DownloadStringCompleted += (sender, e) =>
{
doSomeThing(e.Result);
};
client.DownloadStringAsync(uri);
С Dot.Net 4.5:
public static async void GetDataAsync()
{
DoSomthing(await new WebClient().DownloadStringTaskAsync(MyURI));
}
По завершении загрузки возникает событие DownloadStringCompleted.
При подключении этого события вы получите DownloadStringCompletedEventArgs, который содержит string
имущество Result
с результирующей строкой.
Это будет держать ваш графический интерфейс отзывчивым, и легче понять IMO:
public static async Task<string> DownloadStringAsync(Uri uri, int timeOut = 60000)
{
string output = null;
bool cancelledOrError = false;
using (var client = new WebClient())
{
client.DownloadStringCompleted += (sender, e) =>
{
if (e.Error != null || e.Cancelled)
{
cancelledOrError = true;
}
else
{
output = e.Result;
}
};
client.DownloadStringAsync(uri);
var n = DateTime.Now;
while (output == null && !cancelledOrError && DateTime.Now.Subtract(n).TotalMilliseconds < timeOut)
{
await Task.Delay(100); // wait for respsonse
}
}
return output;
}
Вы действительно хотите дождаться завершения асинхронного метода после его запуска в том же потоке? Почему бы тогда просто не использовать версию синхронизации.
Вы должны подключить событие DownloadStringCompleted и поймать результат там. Тогда вы можете использовать его как настоящий метод Async.
У меня была такая же проблема с WP7, я решил этот метод. wa7 не работает, но если вы используете Action, вы будете вызывать асинхронные функции
public void Download()
{
DownloadString((result) =>
{
//!!Require to import Newtonsoft.Json.dll for JObject!!
JObject fdata= JObject.Parse(result);
listbox1.Items.Add(fdata["name"].ToString());
}, "http://graph.facebook.com/zuck");
}
public void DownloadString(Action<string> callback, string url)
{
WebClient client = new WebClient();
client.DownloadStringCompleted += (p, q) =>
{
if (q.Error == null)
{
callback(q.Result);
}
};
client.DownloadStringAsync(new Uri(url));
}