如何在C#WPF中进行异步Web请求

本文关键字:异步 Web 请求 C#WPF | 更新日期: 2023-09-27 18:21:12

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

问题:

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

逐步

  1. 加载窗口和元素数据网格按钮等
  2. 向服务器发出web请求并显示"数据正在加载.."可能在标签中
  3. 激发一个事件或通知数据已加载的东西,然后将数据网格绑定到列表中,以便应用程序在整个web请求部分保持响应和活动状态

以下是我在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);

我找到了这个链接,但我不确定它如何适用于我的问题。欢迎任何关于如何做到这一点的帮助或想法。

如何在C#WPF中进行异步Web请求

您没有使用WebClient类的原因是什么?请查看WebClient.DownloadStringAsync方法。

使用WebRequest.BeginGetResponse而不是GetResponse,并在回调方法中将序列化结果分配给List

不要忘记,要将来自另一个线程的数据分配给在另一线程中创建的UI元素,您应该使用调度器向UI发送消息

希望这能帮助

这段代码是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);
}