我正在研究如何创建一个可以在我的代码中重用的webclient方法。现在下面的代码将调用client_DownloadStringCompleted,我将不得不处理返回的数据,但我想在请求方法中这样做,所以我可以返回它。
private string request(string json, string url) {
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(new Uri(url);
}
答案 0 :(得分:2)
WebClient调用是异步的,这是有原因的。原因通常是在启动调用并且结果通过线路返回的等待时间内不阻塞UI线程。
我认为你通过强制执行旧学校阻止通话而犯了设计错误。
请参阅此问题中的回答以寻求解决方案。 WebClient - wait until file has downloaded
答案 1 :(得分:0)
由于Web请求是异步执行的,因此没有一种简单的方法可以获得该方法块,并且仅在收到响应时(如果?)返回。 (有一种方法可以做到这一点,但建议不要出于性能,可用性和可维护性的原因。)
相反,您应该编写旨在异步运行的代码。
您的情况的一般模式是指定一个回调方法,该方法将操作作为最终参数 实现该操作的最简单方法是采用单个参数,即webresponse对象。为了帮助代码重用和关注点分离,您可能希望将操作置于异常元组或原始(或可能格式化)的响应内容中。
您需要编写类似的方法:
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);
}
另类,您可以使用async ctp http://msdn.microsoft.com/en-us/vstudio/gg316360
答案 2 :(得分:-2)
可以使用这种同步方法,但它会阻止你的线程,直到下载完成,因此不是首选方法,但我认为它会回答你的问题:
private string Request(string url)
{
WebClient client = new WebClient();
return client.DownloadString(new Uri(url));
}