“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;
}
}