在方法中使用webclient

时间:2012-02-27 22:17:36

标签: c# webclient windows-phone-7

我正在研究如何创建一个可以在我的代码中重用的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);

}

3 个答案:

答案 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));
}