Поскольку веб-запрос выполняется асинхронно, нет простого способа получить этот блок методов и возвращать его только тогда, когда (если?) Получен ответ. (Есть способ сделать это, но его рекомендуют использовать по соображениям производительности, удобства использования и удобства обслуживания.)
Вместо этого вы должны написать код, предназначенный для асинхронного запуска.
Общий шаблон для вашей ситуации - указать метод обратного вызова, который выполняет действие в качестве конечного параметра.
Самый простой способ реализовать действие - это взять один параметр, который является объектом веб-ответа. Чтобы облегчить повторное использование кода и разделение проблем, вы, вероятно, захотите перейти к тому, чтобы действие приняло кортеж исключения или необработанного (или, возможно, отформатированного) содержимого ответа.
Вы хотите написать свой метод что-то вроде:
private string request(string json,
string url,
Action<Exception, string> callback)
{
WebClient client = new WebClient();
client.DownloadStringCompleted += (s, e) =>
{
// add better error handling than this!!!
try
{
callback(e.Error, e.Result);
}
catch (Exception exc)
{
callback(exc, null);
}
};
client.DownloadStringAsync(new Uri(url);
}
В качестве альтернативы, вы можете использовать асинхронный ctp http://msdn.microsoft.com/en-us/vstudio/gg316360