如何在C#WPF中生成异步Web请求
在我的应用程序中,我有一个WPF窗口,其中有一个如何在C#WPF中生成异步Web请求,c#,wpf,asynchronous,webrequest,C#,Wpf,Asynchronous,Webrequest,在我的应用程序中,我有一个WPF窗口,其中有一个DataGrid。在Window\u Loaded事件中,我从服务器获取JSON数据,在反序列化并将其转换为列表之后,我将其绑定到我的数据网格。这样一切都很顺利 问题: 但是,代码的请求部分需要时间,整个窗口看起来是白色的,没有加载任何元素,包括数据网格。我希望使请求部分异步,就像在AJAX中一样,在加载某些内容时显示加载程序图像,然后在加载内容时使用回调函数显示内容 循序渐进 加载窗口和元素数据网格按钮等 向服务器发出web请求,并在标签中显示“
DataGrid
。在Window\u Loaded
事件中,我从服务器获取JSON数据,在反序列化并将其转换为列表之后,我将其绑定到我的数据网格。这样一切都很顺利
问题:
但是,代码的请求部分需要时间,整个窗口看起来是白色的,没有加载任何元素,包括数据网格。我希望使请求部分异步,就像在AJAX中一样,在加载某些内容时显示加载程序图像,然后在加载内容时使用回调函数显示内容
循序渐进
加载窗口和元素数据网格按钮等
向服务器发出web请求,并在标签中显示“数据正在加载…”
触发一个事件或事件,通知数据已加载,然后将数据网格绑定到列表,以便应用程序在整个web请求部分期间保持响应和活动状态
下面是我在Window\u加载的事件处理程序中使用的当前非异步代码
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);
WebResponse-response=req.GetResponse();
Stream responseStream=response.GetResponseStream();
StreamReader sr=新的StreamReader(responseStream,Encoding.UTF8);
字符串JSON=sr.ReadToEnd();
List returnedData=JsonConvert.DeserializeObject(JSON);
我找到了链接,但我不确定它如何适用于我的问题。欢迎提供有关如何执行此操作的任何帮助或想法。使用而不是GetResponse,并将序列化结果分配给回调方法中的列表
不要忘记,要将另一个线程中的数据分配给在另一个线程中创建的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);
}