如何在C#WPF中创建异步Web请求

时间:2012-01-21 10:12:20

标签: c# wpf asynchronous webrequest

在我的应用程序中,我有一个WPF窗口,里面有DataGrid。在Window_Loaded事件中,我从服务器获取JSON数据,并在反序列化并将其转换为List<T>后将其绑定到我的数据网格。这一切都很好。

问题:

但代码的请求部分需要时间,整个窗口看起来是白色的,没有加载任何元素,包括数据网格。我想让请求部分异步,就像在AJAX中我们在加载某些内容时显示加载器图像然后使用一个回调函数,用于在加载内容时显示内容。

一步一步

  1. 加载窗口和元素数据网格按钮等。
  2. 向服务器发出Web请求,并在标签中显示“数据正在加载..”。
  3. 触发通知数据已加载的事件或事物,然后将数据网格绑定到列表,以便应用程序在整个Web请求部分保持响应和活动状态。
  4. 这是我在Window_Loaded事件处理程序

    中使用的当前非异步代码
     WebResponse response = req.GetResponse();
     Stream responseStream = response.GetResponseStream();
     StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
     string JSON = sr.ReadToEnd();
     List<MyObject> returnedData = JsonConvert.DeserializeObject<List<MyObject>>(JSON);
    

    我找到this链接,但我不确定它是如何适用于我的问题。如何解决这个问题的任何帮助或想法都是值得欢迎的。

3 个答案:

答案 0 :(得分:3)

您没有使用WebClient Class的任何原因?看看WebClient.DownloadStringAsync Method

答案 1 :(得分:2)

此代码是Silverlight的示例代码段,也应该适用于WPF。

HttpWebRequest myRequest = WebRequest.CreateHttp("http://yoururl);
myRequest.Method = "GET";
myRequest.BeginGetResponse(GetResponseCallback, myRequest);

private void GetResponseCallback(IAsyncResult asynchronousResult)
{
    try
    {
        WebResponse resp = request.EndGetResponse(asynchronousResult);
        HttpWebResponse response = (HttpWebResponse)resp;
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();
        // Release the HttpWebResponse
        response.Close();

        //Do whatever you want with the returned "responseString"
        Console.WriteLine(responseString);

}

答案 2 :(得分:1)

使用WebRequest.BeginGetResponse代替GetResponse,并将序列化结果分配给回调方法中的List

不要忘记,为了将来自另一个线程的数据分配给在另一个线程中创建的UI元素,您应该使用dispatcher

向UI发送消息

希望这有帮助