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

关于xxxCompleted方法中赋值取值的问题
在做silverlight项目中与wcf通信过程中遇到xxxCompleted方法中给全局变量赋值却取不到的问题。
程序流程是这样的
public partial class MainPage: UserControl{
 xxx wsSession =null; //全局变量
.......
private void Initialize() {
  wsClient.InitializeAsync("ATU", "");
  wsClient.InitializeCompleted += new EventHandler<InitializeCompletedEventArgs> (wsClient_InitializeCompleted);
wsSession.init();// 到了这里wsSession变成null,为什么啊?
...
}
void wsClient_InitializeCompleted(object sender, InitializeCompletedEventArgs e) {
   
  wsSession = e.Result;//这里wsSession已经赋值,不为null
}
我考虑是不是InitializeCompleted是在server端执行?可是怎么样才能把wsSession传过来呢

------解决方案--------------------
wsClient.InitializeAsync("ATU", "");
wsClient.InitializeCompleted += new EventHandler<InitializeCompletedEventArgs> (wsClient_InitializeCompleted);//你这里只是添加了事件,当InitializeAsync执行完后才会执行wsClient_InitializeCompleted
wsSession.init();// 由于InitializeAsync是异步调用,程序不会等待InitializeAsync完成,会先执行这句,当InitializeAsync异步调用完成后才执行wsClient_InitializeCompleted
里的赋值语句
------解决方案--------------------
恩,研究了下发现用InitializeAsync这样的xxxAsync的异步方法达不到效果,
但如果用client.BeginXXX(System.AsyncCallback callback, object asyncState)异步调用就可以了,主线程sleep后,callback里在调用client.EndXXX就会顺利返回结果

我在想,wsClient.InitializeCompleted 这个事件的处理是在主线程上
------解决方案--------------------
异步嘛,事件还没有执行,就到 wsSession.Init() 了。

为什么不把 wsSession.Init() 放在 Completed 事件里呢?
------解决方案--------------------
你没有吗?配置你引用的服务,把生成异步操作勾上,系统会自动帮你生成。
我有个疑问,像你这样操作,干脆直接调用同步方法不就行了,干吗把异步硬生生的搞成同步一样。。。