Заполнение списка из aysnc httpwebrequest

#c# #xml #linq #windows-phone-7.1

#c# #xml #linq #windows-phone-7.1

Вопрос:

В настоящее время я занимаюсь небольшим проектом, который берет XML-документ, анализирует его через Linq (выбирая определенные элементы), а затем привязывает его к списку через асинхронный httpwebrequest.

Вот код;

  void ResponseCallBack(IAsyncResult result)
    {
        //get to the request object
        HttpWebRequest myRequest = result.AsyncState as HttpWebRequest;
        try
        {
            //need error checking
            HttpWebResponse response = myRequest.EndGetResponse(result)
                as HttpWebResponse;
            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {
                String s = sr.ReadToEnd();

                XElement xmlSearch = XElement.Parse(s);
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                {

                    lstbBouquets.ItemsSource = from Search in xmlSearch.Descendants("e2service")
                                               select new GetBouquets
                                               {

                                                   e2servicename = Search.Element("e2servicename").Value
                                               };
                });

                //System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { Debug.WriteLine(s); });


                // Stop progress bar
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { performanceProgressBar.IsIndeterminate = false; });

            }
        }
        catch (WebException webExcp)
        {
            //Debug only, needs error checking
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { Debug.WriteLine(webExcp.ToString()); });
        }
    }
  

Правильно ли я использую диспетчер для связи с потоком пользовательского интерфейса, чтобы обновить список? При выполнении listbox ничего не получает, и я получаю следующий вывод от VS;

Первое случайное исключение типа ‘System.Метод accessexception’ произошел в mscorlib.dll ‘Задача пользовательского интерфейса’ (управляемая): загружена ‘System.SR.dll ‘ Первое случайное исключение типа ‘System.IO.FileNotFoundException’ произошло в mscorlib.dll Система.Windows.Ошибка данных: не удается получить значение ‘e2servicename’ (введите ‘System.Строка’) из ‘DreamboxRemote.Страницы.GetBouquets’ (введите ‘DreamboxRemote.Страницы.GetBouquets’). Выражение привязки: Path=’e2servicename’ DataItem=’DreamboxRemote.Страницы.GetBouquets’ (hashCode=98879357); целевой элемент — ‘System.Windows.Элементы управления.TextBlock’ (Name=»); целевым свойством является ‘Text’ (введите ‘System.Строка’).. Система.Исключение MethodAccessException: попытка получить доступ к методу не удалась: DreamboxRemote.Страницы.GetBouquets.get_e2servicename() в системе.Отражение.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] параметры, CultureInfo culture, StackCrawlMarkamp; stackMark) в системе.Отражение.Запускает исключение первого шанса типа ‘System.Метод accessexception’ произошел в mscorlib.dll

Я предполагаю, что я неправильно обрабатываю потоки, но не вижу, где?

РЕДАКТИРОВАТЬ: я должен отметить, что когда строка записи отладки раскомментирована, она правильно выводит полный XML-документ.

Ответ №1:

Я подозреваю, что проблема связана с замыканием вокруг оператора linq.
Вы не можете привязать ItemsSource таким образом.

Я бы взял вывод из инструкции linq и установил для него свойство, а затем обновил фактический itemssource в потоке пользовательского интерфейса после того, как у вас будут данные.

  Bouquets = from Search in xmlSearch.Descendants("e2service") 
            select new GetBouquets 
            { 
                e2servicename = Search.Element("e2servicename").Value 
            }; 

System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => 
{ 
    lstbBouquets.ItemsSource = Bouquets;
}); 
  

Ответ №2:

   Search.Element("e2servicename")
  

может быть нулевым или

   Search.Element("e2servicename").Value
  

может возвращать значение null. Явные операторы преобразования (string или Nullable) предпочтительнее свойства .Value для обработки возможного значения null .

Вы можете прочитать больше об этом здесь .

   e2servicename = (string) Search.Element("e2servicename")