Witam
Mam problem z poprawnym podejściem do obsługi asynchronicznego wywołania metody z web service (napisany w PHP - nuSOAP z wsdl) w aplikacji klienckiej na platformie Windows Phone 7.
Napisze może najpierw co chcę osiągnąć:
Przy załadowaniu strony ładuję dane z ViewModel (każdy element elementem mojej klasy), które są wyświatlane w listboxie. Następnie dla każdego z elementów z listy chcę wywołać metodę z web service, której argumentem jest właśnie właściwość mojej klasy.
Przewałkowałem trochę internetu na temat Reactive Extensions, bo to wydaje się być najrozsądniejszym rozwiązaniem i póki co na stackoverflow ( http://stackoverflow.com/questions/6396251/problem-with-rx-and-web-service-collection-loading-wp7) podpowiedziano mi, żebym spróbował takiego rozwiązania:
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, GetLastValueCompletedEventArgs>
(ws.GetLastValueAsync, ws.GetLastValueResult);
Func<string, WebServiceClass.ItemGetValues> deserializeFirst = r =>
((List<WebServiceClass.ItemGetValues>)JsonConvert
.DeserializeObject(r,
typeof(List<WebServiceClass.ItemGetValues>)))
.First();
var values =
from item in App.ViewModel.Items
from e in clientGetLastValue(item)
select deserializeFirst(e.Result);
});
values.Subscribe(storedStock.Add);
}
Problem polega na tym, że nie mam tej metody ws.GetLastValueResult. Myślałem, że może chodzi o metodę z przypisanego eventu:
client.GetLastValueCompleted +=
new EventHandler<GetLastValueCompletedEventArgs>(**client_GetLastValueCompleted**);
Ale to nie to. Próbowałem też przypisać obserwatora do eventu GetLastValueCompletedEventArgs. Póki co nie do końca chwytam tej idei tym bardziej, że dopiero zaczynam przygodę z C#.
Z góry dzięki za pomoc.