none
“WCF异步通信”,同步问题 RRS feed

  • 问题

  • WCF是异步通信,比如一个“通信数据”,依赖于另一个“通信线程”的数据。

         第一个取数据的过程:

                 client.GetAreaHeadCountAsync();

                 client.GetAreaHeadCountCompleted += new EventHandler<GetAreaHeadCountCompletedEventArgs>(client_GetAreaHeadCountCompleted);

        void client_GetAreaHeadCountCompleted(object sender, GetAreaHeadCountCompletedEventArgs e)
            {
                //var v = e.Result;
                AreaHeadCount = e.Result;

                GetMonitorDatas();
            } 

      

     第二个方法:

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

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

    void client_GetMonitoringDatasEntityCompleted(object sender, GetMonitoringDatasEntityCompletedEventArgs e)
            {
                var result = e.Result;

                var  datas =FormatMonitorDatas(result);

    ...............................................

    .....................................

           }

    问题一:“第二个WCF通信方法”   依赖于   “第一个WCF通信方法”应该怎么办???           现在是将第二个方法,写在第一个方法的最后的。

    第二种情况:

       

           void client_GetMonitoringDatasEntityTwoCompleted(object sender, GetMonitoringDatasEntityTwoCompletedEventArgs e)
            {
                monitoringstwo = e.Result;
            }

            void client_GetMonitoringDatasEntityCompleted(object sender, GetMonitoringDatasEntityCompletedEventArgs e)
            {
                monitoringsone = e.Result;

            }

            private void BindChart()
            {
                List<Monitoring> noemwmgm = new List<Monitoring>();
                IEnumerable<KeyValuePair<KeyValuePair<string, string>, double[]>> datas;
                if (monitoringsone.Count > 0 && monitoringstwo.Count > 0)
                {

                       问题二:“monitoringsone” 和 “monitoringstwo” 是异步通信返回的结果集,两者没有执行完返回,这里就会报错。

                     如何判断“GetMonitoringDatasEntityCompleted”和“GetMonitoringDatasEntityTwoCompleted”的执行情况???如果都执行完了,就执行下面的方法。否则等待没有执行完“通信方法”执行完,都执行完了才执行下面的方法。   应该怎么做???

    完整的代码:

    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();
    }

    void client_GetMonitoringDatasEntityTwoCompleted(object sender, GetMonitoringDatasEntityTwoCompletedEventArgs e)
      {
      monitoringstwo = e.Result;
      }

      void client_GetMonitoringDatasEntityCompleted(object sender, GetMonitoringDatasEntityCompletedEventArgs e)
      {
      monitoringsone = e.Result;

      }

      private void BindChart()
      {
      List<Monitoring> noemwmgm = new List<Monitoring>();
      IEnumerable<KeyValuePair<KeyValuePair<string, string>, double[]>> datas;
      if (monitoringsone.Count > 0 && monitoringstwo.Count > 0)
      {
      问题:关键是对“GetMonitoringDatasEntityTwoCompleted” 和“GetMonitoringDatasEntityCompleted”判断。怎么判断能写写吗???谢谢了,Tanks  a  lot...
      }


    Science and technology is my lover.



    2012年6月1日 2:02

答案

  • 你好,

    建议你在第一个方法的回调函数里执行第二个方法的请求.

    然后在第二个方法里执行需要执行的后续方法.

    • 已标记为答案 Otomii Lu 2012年6月14日 1:48
    2012年6月4日 3:33
  • 就是把第二个请求放入第一个请求的Completed事件中.

    因为第一个事件已经Completed了,那么第二个事件必然在获取第一个事件的数据后执行的.

    • 已编辑 Otomii Lu 2012年6月6日 3:28
    • 已标记为答案 Otomii Lu 2012年6月14日 1:48
    2012年6月6日 3:26

全部回复

  • 你好,

    建议你在第一个方法的回调函数里执行第二个方法的请求.

    然后在第二个方法里执行需要执行的后续方法.

    • 已标记为答案 Otomii Lu 2012年6月14日 1:48
    2012年6月4日 3:33
  • 你好,

    建议你在第一个方法的回调函数里执行第二个方法的请求.

    然后在第二个方法里执行需要执行的后续方法.

    Thanks  a  lot...

         但是,自己对“WCF”还真不是太精,回调函数在哪里???

         怎样写,能描述下不???


    Science and technology is my lover.

    2012年6月6日 2:27
  • 就是把第二个请求放入第一个请求的Completed事件中.

    因为第一个事件已经Completed了,那么第二个事件必然在获取第一个事件的数据后执行的.

    • 已编辑 Otomii Lu 2012年6月6日 3:28
    • 已标记为答案 Otomii Lu 2012年6月14日 1:48
    2012年6月6日 3:26