silverlight异步调用webservice的问题
public string getSql(string PageName)
{
string MySql = string.Empty;
SLNursing.WS.NurseMainInfo nurseMainInfo = (SLNursing.WS.NurseMainInfo)appSettings["UserInfo"];
sClient.GetSqlAsync(nurseMainInfo.Role, PageName);
sClient.GetSqlCompleted += (s, e) =>
{
if (e.Error == null) MySql = e.Result;
};
return MySql;
}
现在这个方法现在的返回值始终为空。我想请问下这样的话如何能够取得该方法的返回值,就是在这个方法运行完毕后
[解决办法]
看来你不了解异步这个概念。当服务器返回时,会自动执行回调函数里的代码,写异步通信就是要改掉以前的同步代码的习惯。
[解决办法]
为什么要转同步呢,在网络应用或者触摸应用中,异步能达到更好的体验,应该尽可能使用异步方式,而不是同步;LZ如果要是对委托够熟悉,你完全可以不用返回值的,传一个Action或者Func类型的委托就可以了,或者使用事件模式
[解决办法]
因为是异步调用的,所以你在调试的时候调用上下文sClient为0行,因为数据还没有加载完成。Completed 事件是加载完成后调用。
sClient.Completed += (se, ea) =>{//if (e.Error == null) MySql = e.Result;}
[解决办法]
是Completed 不是GetSqlCompleted
[解决办法]
当然有这个方法了呀!
[解决办法]
1 public string getSql(string PageName)
2 {
3 string MySql = string.Empty;
4 SLNursing.WS.NurseMainInfo nurseMainInfo = SLNursing.WS.NurseMainInfo) appSettings["UserInfo"];
5 sClient.GetSqlAsync(nurseMainInfo.Role, PageName);
6 sClient.GetSqlCompleted += (s, e) =>
7 {
8 if (e.Error == null) MySql = e.Result;
9 };
10 return MySql;
11 }
///////////////////////////////////
6、7、8、9 行是定义,这个定义在执行的时候走不到第10行,只是作为函数过程,但这个函数过程又没有返回值,你有没有发起异步调用(如:sClient.GetSqlAnsy(...);),所以就会出现你所说的结果。建议你显式地写定义而不是隐式定义。
private void m(object sender, GetSqlCompletedPara e)
{
if (e.Error == null) MySql = e.Result;
}
sClient.GetSqlCompleted +=//打完Tab键后自动生函数过程名,为简单记为m(s,e)
sClient.GetSqlAnsy(...);