如何在C#WPF中进行异步Web请求
本文关键字:异步 Web 请求 C#WPF | 更新日期: 2023-09-27 18:21:12
在我的应用程序中,我有一个WPF窗口,其中有一个DataGrid
。在Window_Loaded
事件中,我从服务器获取JSON数据,在将其反序列化并转换为List<T>
后,我将其绑定到我的数据网格。这样一切都很顺利。
问题:
但代码的请求部分需要时间,整个窗口看起来是白色的,没有加载任何元素,包括数据网格。我想让请求部分异步,就像在AJAX中,我们在加载时显示加载程序图像,然后在加载时使用回调函数显示内容一样。
逐步
- 加载窗口和元素数据网格按钮等
- 向服务器发出web请求并显示"数据正在加载.."可能在标签中
- 激发一个事件或通知数据已加载的东西,然后将数据网格绑定到列表中,以便应用程序在整个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);
我找到了这个链接,但我不确定它如何适用于我的问题。欢迎任何关于如何做到这一点的帮助或想法。
您没有使用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);
}