我现在开发的东西,使用WCF和sliverlght配合,其中WCF提供服务,sliverlight做前段显示,碰到很多sliverlight应用返回的问题。其中一个是循环,一个是等待阻塞
OK,
按照这个为例子:
http://www.aspxcs.net/HTML/104052632.html
通常调用返回值的方法是调用e.Result,调用方法是
| { client.GetRandomAsync(100); client.GetRandomCompleted += new EventHandler } void client_GetRandomCompleted(object sender, WCFTest.DataServiceRef.GetRandomCompletedEventArgs e) { this.txtData.Text = "The return data is "+e.Result.ToString(); } |
其中GetRandomAsync(100);可以视为给wcf发送信息,启动GetRandom事件。
而 client.GetRandomCompleted += new EventHandler
而,WCFTest.DataServiceRef.GetRandomCompletedEventArgs包含返回值,就是e.Result。这样在触发中处理返回值。
不过这样要写新的方法,而且很多方法内的变量要变成全局变量才可以传值,尤其是在用多个返回值的时候,大大增加麻烦。一种更灵活的返回值处理方法是
|
{ client.getRandomAsync(i); client.getRandomCompleted += (sender2, e2) => } |
这个是一个简单的方法,其中sender2, e2,分别是触发和返回,可以直接在后面进行处理,简单很多。
OK,我常常会有一个问题,就是等待返回值阻塞的问题,比如我要从WCF里面获得返回值,再进行下一步操作。
比较麻烦的方法是,把下一步操作放在完成触发的方法里面,比如
|
如果要等待的时间太多了,或者逻辑情况很麻烦的话,就头大了。比如这个情况
| { client.getRandomAsync(6); client.getRandomCompleted += new EventHandler MessageBox.Show(da.ToString()); } void client_getRandomCompleted(object sender, getRandomCompletedEventArgs e) { da += e.Result; MessageBox.Show(da.ToString()); } |
就会出现两个不同的结果,一个是0,一个是后来的WCF的返回值。
解决这个问题,一个是改变程序设计,还有就是用AsyncCallback parameter and wrappers for Begin / End.
这个后面再说
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22259926/viewspace-629273/ ,如需转载,请注明出处,否则将追究法律责任。