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

3
在我的应用程序中,我有一个 WPF 窗口,其中包含一个 DataGrid。在 Window_Loaded 事件中,我从服务器获取 JSON 数据,并将其反序列化并转换为 List,然后将其绑定到我的数据网格中。这种方式一切都运作良好。
问题是,请求部分的代码需要时间,整个窗口似乎变成了白色,没有加载任何元素,包括数据网格。我想让请求部分异步化,就像在 AJAX 中我们显示一个加载器图像,而当加载完成时使用回调函数显示内容。
具体步骤如下:
1. 加载窗口和元素数据网格按钮等。 2. 向服务器发出网络请求,在标签中显示“正在加载数据...”。 3. 触发事件或其他操作,通知数据已经加载完毕,然后将数据网格绑定到列表,以使整个网络请求过程中应用程序保持响应和活动状态。
以下是我在 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);

我找到了这个链接(点击查看),但我不确定它如何适用于我的问题。欢迎任何帮助或想法来解决这个问题。
3个回答

4

2

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

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

希望这有所帮助。


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);

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接