日期:2014-05-18  浏览次数:20766 次

“WCF异步通信”,同步问题
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通信方法”应该怎么办??? 现在是将第二个方法,写在第一个方法的最后的。

------解决方案--------------------
写在 GetAreaHeadCountCompleted 中
------解决方案--------------------
用一个标记变量,初值0

在GetMonitoringDatasEntityTwoCompleted 执行时判断

是否等于0 等于0赋值为2

不等于0执行要执行的方法,并重置为0

在GetMonitoringDatasEntityCompleted 执行时也判断

是否等于0 等于0赋值为3

不等于0执行要执行的方法,并重置为0

------解决方案--------------------
把 GetMonitoringDatasEntityTwoAsync 的调用挪到 client_GetMonitoringDatasEntityCompleted 里,
把 BindChart 挪到 client_GetMonitoringDatasEntityTwoCompleted 里。

类似如下:

方法1_Async

方法1_Completed
方法2_Async

方法2_Completed
BindChart
------解决方案--------------------
C# code

int flag=0;
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);



}

void client_GetMonitoringDatasEntityTwoCompleted(object sender, GetMonitoringDatasEntityTwoCompletedEventArgs e)
  {
  monitoringstwo = e.Result;
     if(flag==0)
     {
           flag=2;
     }
     else
     {
          BindChart(); 
          flag=0;
      }
  }

  void client_GetMonitoringDatasEntityCompleted(object sender, GetMonitoringDatasEntityCompletedEventArgs e)
  {
  monitoringsone = e.Result;
if(flag==0)
     {
           flag=3;
     }
     else
     {
          BindChart(); 
          flag=0;
      }

  }