积极答复者
怎样获得重载后返回的数据?

问题
-
服务端:
[WebMethod]
public string test()
{
return "ok";
}
SL端:
string aa()
{
string value = null;
sunWeb.WebService1SoapClient ss = new sunWeb.WebService1SoapClient();
ss.testAsync();
// ss.select_Completed += new EventHandler<Sunpro.sunWeb.testCompletedEventArgs>(ss_aa);
return value;
}
问题是:
当调用aa()时怎样让aa()返回"ok" ?
大家一般是用什么办法的?
答案
-
异步编写模式,明显同步执行不一样。增加了编程的复杂度。
只能使用事件触发方式。而不能直接返回,SL采用这种异步方式,主要是防止远程调用时间过长,导致SL程序挂起。
如果一定要这样的话,就要调用后阻塞到返回结果为止。不过一般是不推荐的。- 已建议为答案 Min-Hong Tang - MSFT 2009年12月3日 6:01
- 已标记为答案 Min-Hong Tang - MSFT 2009年12月18日 5:46
全部回复
-
我遇到和你一样的问题。但经过反复研究试验,也解决不了。
1)因为SL不支持同步模式,所以 aa 函数没办法直接返回服务器端的结果。只有通过事件来处理。
2)如果你使用XmlHttp的同步模式来访问服务器端,实现你那个aa函数是完全可以的。
---------------------
3)异步模式确实会给我们的程序逻辑搞得异常复杂。我是希望微软的SL也提供同步模式。
----------------------
如果楼主能够很好地实现你的aa函数(注:不允许使用XmlHttp的同步模式访问服务器,因为我们既然用SL,就不要去用浏览器的对象,省得脱离浏览器运行时你的SL程序转不了)。请通知一声。 -
异步编写模式,明显同步执行不一样。增加了编程的复杂度。
只能使用事件触发方式。而不能直接返回,SL采用这种异步方式,主要是防止远程调用时间过长,导致SL程序挂起。
如果一定要这样的话,就要调用后阻塞到返回结果为止。不过一般是不推荐的。- 已建议为答案 Min-Hong Tang - MSFT 2009年12月3日 6:01
- 已标记为答案 Min-Hong Tang - MSFT 2009年12月18日 5:46
-
1)关键是如何阻塞?能否给个例子?
2)如果SL提供诸如DoEvents之类的函数,阻塞就好办。可是SL就是不提供,我真不知道如何阻塞。注:如果你打算设一个标志,做一个循环在那里等待,我可以告诉你,那将是一个死循环,你试验试验就知道了。
3)我不知道你是否试验过如何阻塞SL的线程?
4)我是研究了半天也办法实现那个aa函数。
5)实现aa函数这种情况,如果是做着玩玩的程序,可能不需要,但在真正的应用开发中,非常需要!!!
6)阻塞的思路似乎很好,但是不一定能在SL中实现(标准的.net很容易实现,SL的我办不到),希望能够实现aa函数类似的代码贴出来,让大家参考。