我有一个课程,可以抓取一些数据并将其返回为字符串。当此对象工作时,有一个旋转图标,让用户知道正在完成工作。问题是响应返回之前的代码退出。我卡住了

while(response == null)

只是看看发生了什么事和

response = (HttpWebResponse)request.EndGetResponse(AsyncResult);

不发射。它可以在控制台应用程序中发射正常,因此我将其归结为我正在做的Silverlight不喜欢的事情,这是完整的代码:

public class HttpWorker
{
    private HttpWebRequest request;
    private HttpWebResponse response;
    private string responseAsString;
    private string url;

    public HttpWorker()
    {

    }

    public string ReadFromUrl(string Url)
    {
        url = Url;
        request = (HttpWebRequest)WebRequest.Create(url);

        request.CookieContainer = new CookieContainer();
        request.AllowAutoRedirect = true;
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6";

        AsyncRequest(); // The Demon!

        return responseAsString;
    }

    private void AsyncRequest()
    {
        request.BeginGetResponse(new AsyncCallback(FinaliseAsyncRequest), null);
    }

    private void FinaliseAsyncRequest(IAsyncResult AsyncResult)
    {
        response = (HttpWebResponse)request.EndGetResponse(AsyncResult);


        if (response.StatusCode == HttpStatusCode.OK)
        {
            // Create the stream, encoder and reader.
            Stream responseStream = response.GetResponseStream();
            Encoding streamEncoder = Encoding.UTF8;
            StreamReader responseReader = new StreamReader(responseStream, streamEncoder);
            responseAsString = responseReader.ReadToEnd();
        }
        else
        {
            throw new Exception(String.Format("Response Not Valid {0}", response.StatusCode));
        }
    }

}
有帮助吗?

解决方案

你要和 (while response == null) 在UI线程上?异步回调 HttpRequest 将在UI线程上传递,因此,如果您在同一线程上循环,则无法运行回调。您需要返回以允许主要消息循环运行,然后将您的异步回调交付。

上面的设计表明,您真正想要的是同步提取。忘记回调,然后打电话 FinaliseAsyncRequest 里面 ReadFromUrl 你自己。 UI将悬挂直到请求完成为止,但这听起来像您想要的。

其他提示

我在此处发布了一个使用WebClient和HTTPWebRequest的工作示例。

网络电视机,httpwebrequest和Windows Phone上的UI线程7

请注意,对于任何非琐碎处理,后者是首选的,以避免阻止UI。

随意重复使用代码。

从Web服务器中获取字符串的最简单方法是使用 WebClient.DownloadStringAsync() (MSDN文档).

尝试这样的事情:

private void DownloadString(string address)
{
    WebClient client = new WebClient();
    Uri uri = new Uri(address);

    client.DownloadStringCompleted += DownloadStringCallback;
    client.DownloadStringAsync(uri);

    StartWaitAnimation();
}


private void DownloadStringCallback(object sender, DownloadStringCompletedEventArgs e)
{
    // Do something with e.Result (which is the returned string)

    StopWaitAnimation();
}

请注意,该回调在UI线程上执行,因此您只能在您的回调方法执行不当时使用此方法,因为它会在执行时阻止UI。

如果您需要对Web请求进行更多控制,则可以使用HTTPWebRequest。

如果您确实必须模仿同步行为,请查看 Silverlight WP7中的伪造同步通话

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top