RX和Web服务集合加载wp7时出现问题

问题描述

| 我是C#和wp7平台的初学者,我对从Web服务获取请求有个好主意。 我用PHP(nusoap-WSDL)制作了Web服务,并且在“正常”下使用一切正常。 现在,当打开Page时,我将ObservableCollection保存在IsolatedStorage中,并进行加载(监视的堆栈交换列表)。然后,我想刷新Web服务中每个项目的数据。 我不知道这是否是个好主意。 码:
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方法中的List,但该方法是client_GetLastValueCompleted,这不是一个好主意,因为我只需要在foreach中所有已运行的GetLastValueAsync完成后才运行该方法。 第二个问题:由于异步Web服务方法StoredStock有时与App.viewmodel.Items具有不同的顺序。 有什么好主意如何以正确的方式做到这一点? 最好的祝福, 卢卡斯     

解决方法

        您实际上混合了多种调用Web服务和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);
}
您必须为您的Web服务客户端获取正确的方法调用名称,但是代码应该大致正确。让我知道你怎么去。 我更正了上面的代码。应该在
Using
调用内返回了查询,而不是将查询分配给
values
。 我更正了对
FromAsyncPattern
的调用,以使用通过电子邮件发送的实际Web服务引用类中的正确方法名称和返回类型。 它看起来应该像这样:
Observable.FromAsyncPattern<string,GetLastValueResponse>
    (ws.BeginGetLastValue,ws.EndGetLastValue);
    ,        如果您是C#的初学者,请暂时避免使用RX。这是一项很酷的技术,但是如果您对它所发生的事情不了解,则会带来更多的问题而不是解决的。 使用一个简单的事件,然后在每个异步项到达时,在存储的列表中找到并更新对应的项。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...