Как сделать асинхронные веб-запросы в C # WPF - PullRequest
2 голосов
/ 21 января 2012

В моем приложении у меня есть окно WPF, в котором есть DataGrid.В событии Window_Loaded я получаю данные JSON с сервера и после десериализации и преобразования их в List<T> связываю их с моей сеткой данных.Все работает нормально таким образом.

Проблема:

Но часть кода запроса требует времени, и все окно кажется белым без загруженных элементов, включая сетку данных. Я хочу сделать запросЧасть асинхронная, как и в 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 ]

3 голосов
/ 21 января 2012

По какой причине вы не используете WebClient Class ?Взгляните на метод WebClient.DownloadStringAsync .

2 голосов
/ 21 января 2012

Этот код является примером фрагмента 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);

}
1 голос
/ 21 января 2012

Используйте WebRequest.BeginGetResponse Вместо GetResponse и присвойте сериализованный результат списку в методе обратного вызова

Не забывайте, что для назначения данных из другого потока элементу пользовательского интерфейса, созданному в другом потоке, вы должны отправить сообщение в пользовательский интерфейс с помощью dispatcher

Надеюсь, это поможет

...