如何在C#WPF中生成异步Web请求

如何在C#WPF中生成异步Web请求,c#,wpf,asynchronous,webrequest,C#,Wpf,Asynchronous,Webrequest,在我的应用程序中,我有一个WPF窗口,其中有一个DataGrid。在Window\u Loaded事件中,我从服务器获取JSON数据,在反序列化并将其转换为列表之后,我将其绑定到我的数据网格。这样一切都很顺利 问题: 但是,代码的请求部分需要时间,整个窗口看起来是白色的,没有加载任何元素,包括数据网格。我希望使请求部分异步,就像在AJAX中一样,在加载某些内容时显示加载程序图像,然后在加载内容时使用回调函数显示内容 循序渐进 加载窗口和元素数据网格按钮等 向服务器发出web请求,并在标签中显示“

在我的应用程序中,我有一个WPF窗口,其中有一个
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);
    
    }