Заполнение списка из aysnc httpwebrequest - PullRequest
0 голосов
/ 14 октября 2011

В настоящее время я работаю над небольшим проектом, который захватывает 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()); });
        }
    }

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

Первое случайное исключение типа 'System.MethodAccessException' произошло в mscorlib.dll 'UI Task' (Managed): Loaded 'System.SR.dll «Первое случайное исключение типа« System.IO.FileNotFoundException »произошло в mscorlib.dll System.Windows.Data Ошибка: невозможно получить значение« e2servicename »(тип« System.String ») из« DreamboxRemote.Pages »..GetBouquets '(введите' DreamboxRemote.Pages.GetBouquets ').BindingExpression: Path = 'e2servicename' DataItem = 'DreamboxRemote.Pages.GetBouquets' (HashCode = 98879357);Целевым элементом является 'System.Windows.Controls.TextBlock' (Name = '');Свойство target имеет значение «Text» (тип «System.String»). System.MethodAccessException: попытка доступа к методу не удалась: DreamboxRemote.Pages.GetBouquets.get_e2servicename () в System.Reflection.RuntimeMethodInfo.InternalInvoke (Object obj, invingBlaytrags)., Связыватель, параметры Object [], CultureInfo culture, StackCrawlMark & ​​stackMark) в System.Reflection.RunПервое исключение первого типа «System.MethodAccessException» произошло в mscorlib.dll

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

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

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

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

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

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

System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => 
{ 
    lstbBouquets.ItemsSource = Bouquets;
}); 
0 голосов
/ 07 ноября 2011
  Search.Element("e2servicename")

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

  Search.Element("e2servicename").Value

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

Подробнее об этом можно прочитать здесь .

  e2servicename = (string) Search.Element("e2servicename")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...