проблема с загрузкой коллекции RX и веб-сервиса wp7 - PullRequest
0 голосов
/ 18 июня 2011

Я новичок в работе с платформами C # и wp7, и у меня возникли проблемы с хорошей идеей получить запрос от веб-службы.

Я сделал веб-сервис на PHP (nusoap - WSDL), и все работает нормально в обычном режиме. Теперь у меня есть ObservableCollection, сохраненный в IsolatedStorage, с загрузкой, когда страница открыта (список отслеживаемых стеков). Затем я хочу обновить данные для каждого элемента из веб-службы.

Я не знаю, хорошая ли это идея.

Код:

private GPWWebservicePortTypeClient client = new GPWWebservicePortTypeClient();
private ObservableCollection<WebServiceClass.ItemGetValues> StoredStock = 
                      new ObservableCollection<WebServiceClass.ItemGetValues>();     
public const string _fileName = "listaObserwowanych.xml";
public Page()
{
   InitializeComponent();

   DataContext = App.ViewModel;

   this.Loaded += new RoutedEventHandler(Page_Loaded);

   client.GetLastValueCompleted +=
            new EventHandler<GetLastValueCompletedEventArgs>(client_GetLastValueCompleted);

   foreach (var itemGetValuese in App.ViewModel.Items)
   {
      client.GetLastValueAsync(itemGetValuese.name);
   }

   var o = 
       Observable.FromEvent<GetLastValueCompletedEventArgs(client,"GetLastValueCompleted")
                                                           .Subscribe(setList);
}

void client_GetLastValueCompleted(object sender, GetLastValueCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show(Convert.ToString(e.Error));
    }
    else
    {
        ObservableCollection<WebServiceClass.ItemGetValues> ListValues = 
          (ObservableCollection<WebServiceClass.ItemGetValues>)                                                                      
           JsonConvert.DeserializeObject(e.Result, 
           typeof(ObservableCollection<WebServiceClass.ItemGetValues>));
        StoredStock.Add(ListValues[0]);
    }
}

private void setList(IEvent<GetLastValueCompletedEventArgs> ex)
{
    List.ItemsSource = StoredStock;
}


void Page_Loaded(object sender, RoutedEventArgs e)
{
    App.ViewModel.LoadData();
    List.ItemsSource = App.ViewModel.Items;
}

Как вы видите, я использую RX для вызова метода client_GetLastValueCompleted и добавляет результат сохранения во вспомогательную переменную (StoredStock). Затем обновите List в методе setList, но этот метод - client_GetLastValueCompleted, что не очень хорошая идея, потому что мне нужно запускать этот метод только после завершения всех запущенных GetLastValueAsync в foreach. Вторая проблема: из-за асинхронного метода веб-службы StoredStock иногда имеет другой порядок, чем App.ViewModel.Items.

Любая хорошая идея, как сделать это правильно? С уважением,

Lukas

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Вы действительно путаете несколько способов вызова веб-сервисов и Rx.Вам действительно нужно выбрать один путь и придерживаться его.

Если вы собираетесь использовать Rx, то у вас будет что-то вроде этого:

public Page()
{
    InitializeComponent();

    DataContext = App.ViewModel;

    this.Loaded += new RoutedEventHandler(Page_Loaded);
}

void Page_Loaded(object sender, RoutedEventArgs e)
{
    App.ViewModel.LoadData();

    var storedStock =
        new ObservableCollection<WebServiceClass.ItemGetValues>();  

    List.ItemsSource = storedStock;

    var values =
        Observable.Using<WebServiceClass.ItemGetValues, GPWWebservicePortTypeClient>
            (() => new GPWWebservicePortTypeClient(), ws =>
            {
                var clientGetLastValue = Observable
                    .FromAsyncPattern<string, GetLastValueResponse>
                    (ws.BeginGetLastValue, ws.EndGetLastValue);

                Func<string, WebServiceClass.ItemGetValues> deserializeFirst = r =>
                    ((List<WebServiceClass.ItemGetValues>)JsonConvert
                    .DeserializeObject(r,
                        typeof(List<WebServiceClass.ItemGetValues>)))
                    .First();

                return
                    from item in App.ViewModel.Items
                    from e in clientGetLastValue(item)
                    select deserializeFirst(e.Result);
            });

    values.Subscribe(storedStock.Add);
}

Вы будетедолжны получить правильные имена вызовов методов для вашего клиента веб-службы, но код должен быть примерно правильным.Дайте мне знать, как у вас дела.


Я исправил код выше.Я должен был вернуть запрос внутри вызова Using, а не присваивать его values.


Я исправил вызов на FromAsyncPattern, чтобы использовать правильные имена методов и тип возврата из реальной сетиСсылка на класс обслуживания отправлена ​​по электронной почте.

Это должно выглядеть так:

Observable.FromAsyncPattern<string, GetLastValueResponse>
    (ws.BeginGetLastValue, ws.EndGetLastValue);
1 голос
/ 22 июня 2011

Если вы новичок в C #, постарайтесь пока избегать RX.Это классная технология, но если вы используете ее без четкого понимания того, что происходит, она принесет больше проблем, чем решит.

Используйте простое событие, и когда каждый асинхронный элемент прибывает, найдите и обновитеодин корреспондент в сохраненном списке.

...