none
一个“类”中,不能多次调用“WCF 代理类”中同一方法??? RRS feed

  • 问题

  • 一个“类”中,不能多次调用“WCF 代理类”中同一方法???

    代码如下:

         private void BindBaseDatas()
            {
                string weburl = Application.Current.Host.Source.ToString();
                weburl = weburl.Substring(0, (weburl.Length - 23)) + "/ChartsService.svc";
                MyChartsService.ChartsServiceClient client = new MyChartsService.ChartsServiceClient("CustomBinding_ChartsService1", weburl);

                client.GetCodeDetailsEntityDataAsync("BldingFunction");
    client.GetCodeDetailsEntityDataCompleted+=new EventHandler<GetCodeDetailsEntityDataCompletedEventArgs>(client_GetCodeDetailsEntityDataCompleted2);


                client.GetCodeDetailsEntityDataAsync("MeterUseType");
    client.GetCodeDetailsEntityDataCompleted += new EventHandler<MyChartsService.GetCodeDetailsEntityDataCompletedEventArgs>(client_GetCodeDetailsEntityDataCompleted);


                BindYears();
            }

            void client_GetCodeDetailsEntityDataCompleted2(object sender, MyChartsService.GetCodeDetailsEntityDataCompletedEventArgs e)
            {
                tlb_Region.ItemsSource = e.Result;
                tlb_Region.SelectedIndex = 0;

                //GetMonitorDatas();
            }

            void client_GetCodeDetailsEntityDataCompleted(object sender, MyChartsService.GetCodeDetailsEntityDataCompletedEventArgs e)
            {
                RadMenuItem rmi_all = new RadMenuItem();

                rmi_all.Header = "总量";
                rmi_all.Tag = "";
                rmi_all.IsCheckable = true;
                rmi_all.IsChecked = true;

                rmi_Subentry.Items.Add(rmi_all);

                ObservableCollection<MyChartsService.CodeDetailsEntity> subentrys = e.Result;
                foreach (var st in subentrys)
                {
                    RadMenuItem rmi = new RadMenuItem();
                    rmi.Header = st.DpCodeName;
                    rmi.Tag = st.DpCodeId;
                    rmi.IsCheckable = true;

                    rmi_Subentry.Items.Add(rmi);
                }
            }

    问题:像这样的需求,需要多次调用“代理类”中的“同一方法"应该怎么办???这是一个WCF缺点啊。。。

                           

    Science and technology is my lover.

    2012年5月30日 10:35

答案

全部回复

  • 你好,你使用了两次client.GetCodeDetailsEntityDataCompleted+=,即就该了值,事件的复制类似于引用,所以必然出错.

    既然在同一个类中进行的,那么代码之间几乎是按毫秒计算的前后差异,为什么不一起发送?

    我建议把数据一起发送.

    2012年6月1日 2:34
  • 你好,你使用了两次client.GetCodeDetailsEntityDataCompleted+=,即就该了值,事件的复制类似于引用,所以必然出错.

    既然在同一个类中进行的,那么代码之间几乎是按毫秒计算的前后差异,为什么不一起发送?

    我建议把数据一起发送.

    谢谢,Tanks  a  lot...

    如何一起发送???参数条件不一样啊,而且两个结果集要分开的,需要单独处理。

          

    代码如下:

         private void BindBaseDatas()
            {
                string weburl = Application.Current.Host.Source.ToString();
                weburl = weburl.Substring(0, (weburl.Length - 23)) + "/ChartsService.svc";
                MyChartsService.ChartsServiceClient client = new MyChartsService.ChartsServiceClient("CustomBinding_ChartsService1", weburl);

                client.GetCodeDetailsEntityDataAsync("BldingFunction");
    client.GetCodeDetailsEntityDataCompleted+=new EventHandler<GetCodeDetailsEntityDataCompletedEventArgs>(client_GetCodeDetailsEntityDataCompleted2);


                client.GetCodeDetailsEntityDataAsync("MeterUseType");
    client.GetCodeDetailsEntityDataCompleted += new EventHandler<MyChartsService.GetCodeDetailsEntityDataCompletedEventArgs>(client_GetCodeDetailsEntityDataCompleted);


                BindYears();
            }

            void client_GetCodeDetailsEntityDataCompleted2(object sender, MyChartsService.GetCodeDetailsEntityDataCompletedEventArgs e)
            {
                tlb_Region.ItemsSource = e.Result;
                tlb_Region.SelectedIndex = 0;

                //GetMonitorDatas();
            }

            void client_GetCodeDetailsEntityDataCompleted(object sender, MyChartsService.GetCodeDetailsEntityDataCompletedEventArgs e)
            {
                RadMenuItem rmi_all = new RadMenuItem();

                rmi_all.Header = "总量";
                rmi_all.Tag = "";
                rmi_all.IsCheckable = true;
                rmi_all.IsChecked = true;

                rmi_Subentry.Items.Add(rmi_all);

                ObservableCollection<MyChartsService.CodeDetailsEntity> subentrys = e.Result;
                foreach (var st in subentrys)
                {
                    RadMenuItem rmi = new RadMenuItem();
                    rmi.Header = st.DpCodeName;
                    rmi.Tag = st.DpCodeId;
                    rmi.IsCheckable = true;

                    rmi_Subentry.Items.Add(rmi);
                }
            }

    像这样的需求,需要多次调用“代理类”中的“同一方法"应该怎么办???这是一个WCF缺点啊。。。

    实例化模式:WCF4.0  默认的“DataSerialize" 。  没有开启会话。。。

    问题1:

          如上面所示,在“BindBaseDatas()”方法中“两次”调用了“client.GetCodeDetailsEntityDataCompleted”,它们都委托给了同一个“client_GetCodeDetailsEntityDataCompleted”,这样怎么处理返回的数据???

    问题二:      

           如上面所示,在“BindBaseDatas()”方法中“两次”调用了“client.GetCodeDetailsEntityDataCompleted”,它们分别委托给“client_GetCodeDetailsEntityDataCompleted”个“client_GetCodeDetailsEntityDataCompleted”和“client_GetCodeDetailsEntityDataCompleted2”,   但是返回只有第二次调用服务返回的数据,怎么办???

    问题三:怎么实现多次调用同一个服务???

    比如:需要两次调用“GetMonitoringDatasEntity”服务方法,就要再创建一个“GetMonitoringDatasEntityTwo”服务方法,它们的参数和返回值都是一样的。

    这个问题可以解决吗???    Thanks  a  lot...    完整代码如下:

    private void BindBaseDatas()
      {
      string weburl = Application.Current.Host.Source.ToString();
      weburl = weburl.Substring(0, (weburl.Length - 23)) + "/ChartsService.svc";
      MyChartsService.ChartsServiceClient client = new MyChartsService.ChartsServiceClient("CustomBinding_ChartsService1", weburl);


      client.GetMonitoringDatasEntityAsync(monitortype, monitordate_type, monitordate_value, monitortype_type, monitortype_value, meterusetype, true);

      client.GetMonitoringDatasEntityCompleted += new EventHandler<GetMonitoringDatasEntityCompletedEventArgs>(client_GetMonitoringDatasEntityCompleted);


    client.GetMonitoringDatasEntityTwoAsync(monitortype, monitordate_type, monitordate_value, monitortype_type, monitortype_value, meterusetype, false);
      client.GetMonitoringDatasEntityTwoCompleted += new EventHandler<GetMonitoringDatasEntityTwoCompletedEventArgs>(client_GetMonitoringDatasEntityTwoCompleted);


    BindChart();
    }


    Science and technology is my lover.

    2012年6月1日 3:26
  • 你好,

    你这个问题是编码方面的问题,而不是WCF方面的问题.

    Event事件如果你使用+=赋值两次的话,那么就会抛弃前面那一次.因为一个Event只能有一个Handler.

    按你这种情况,你就要重新创建一个WCF方法来提供第二个需要注册的Event的请求.

    因为你提出了一个重复的问题,我会在另外一个帖子中回复:

    http://social.msdn.microsoft.com/Forums/zh-CN/silverlightzhchs/thread/5d13626a-83e0-4752-bf10-aaaa27436c48


    • 已编辑 Otomii Lu 2012年6月6日 3:29
    • 已标记为答案 Otomii Lu 2012年6月6日 3:30
    2012年6月1日 5:45
  • 你好,

    你这个问题是编码方面的问题,而不是WCF方面的问题.

    Event事件如果你使用+=赋值两次的话,那么就会抛弃前面那一次.因为一个Event只能有一个Handler.

    按你这种情况,你就要重新创建一个WCF方法来提供第二个需要注册的Event的请求.

    Thanks  a  lot...

          但是,确实有这样的需求啊。


    Science and technology is my lover.

    2012年6月6日 2:59
  • 因为你提出了一个重复的问题,我会在另外一个帖子中回复:

    http://social.msdn.microsoft.com/Forums/zh-CN/silverlightzhchs/thread/5d13626a-83e0-4752-bf10-aaaa27436c48

    2012年6月6日 3:30