在我的应用程序中,我有一个WPF窗口,里面有DataGrid
。在Window_Loaded
事件中,我从服务器获取JSON数据,并在反序列化并将其转换为List<T>
后将其绑定到我的数据网格。这一切都很好。
问题:
但代码的请求部分需要时间,整个窗口看起来是白色的,没有加载任何元素,包括数据网格。我想让请求部分异步,就像在AJAX中我们在加载某些内容时显示加载器图像然后使用一个回调函数,用于在加载内容时显示内容。
一步一步
这是我在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链接,但我不确定它是如何适用于我的问题。如何解决这个问题的任何帮助或想法都是值得欢迎的。
答案 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发送消息希望这有帮助