Я новичок с платформой С# и 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). Затем обновите список в методе setList, но этот метод client_GetLastValueCompleted, что не очень хорошая идея, потому что мне нужно запускать этот метод только тогда, когда все запущенные GetLastValueAsync в foreach завершены. Вторая проблема: из-за асинхронного метода веб-службы StoredStock иногда имеет другой порядок, чем App.ViewModel.Items .
Любая хорошая идея, как сделать это правильно? С наилучшими пожеланиями,
Лукас