为什么我的服务引用只生成异步方法?

8
我在VS2008中有一个服务引用(不是web引用),指向我没有编写的Web服务。该引用有效,但我只能使用每个方法的异步版本。
在“配置服务引用”对话框中,“生成异步操作”被选中并灰显。首先,我认为勾选此框会生成异步方法,而不是阻塞方法的替代方法。其次,我从未见过它变灰。
我有编写WCF和ASMX时代Web服务的经验,以前从未遇到过这种情况。可能是什么原因?
谢谢。

你能展示一下你客户端和主机配置文件的相关部分吗? - Tad Donaghe
3个回答

13

我敢打赌你的问题是因为你正在使用Silverlight来做这件事。不幸的是我没有安装相关工具,所以无法测试这个理论,但我知道从Silverlight进行服务调用只能是异步的。也许你正在使用Silverlight项目模板并在其中创建服务引用?Visual Studio可能已经足够聪明,在这种情况下不生成阻塞方法。

参考资料:

http://msdn.microsoft.com/en-us/library/cc197937(VS.95).aspx


非常好奇你是否正确。即使不是,这也是一个很好的猜测! - Tad Donaghe
你说得对,它是Silverlight。我很惊讶自己竟然忘了提到这一点。这是什么原因呢?显然,我可以通过立即等待响应来将异步调用转换为同步调用(这是不是不好的做法?)。只是有点烦人。为什么生成的代码不能替我完成这个任务呢? - Greg Smalter
我认为原因是Silverlight在浏览器的UI线程中执行。如果你阻塞了,整个页面都可能会无响应。 - Randolpho
是的,我现在感觉比起我最初写那条评论时要聪明一点。在我的情况下,我甚至不需要阻塞,虽然我可以想到一种情况,你需要Web服务调用,第二个依赖于第一个,但这有点牵强,geofftnz链接的文章有所帮助。 - Greg Smalter
1
@randolpho,你以为你已经摆脱了JavaScript异步的本质了吗?好吧,我做到了 :-) - Simon_Weaver

3
银光插件运行在浏览器的UI线程上。如果您进行同步网络调用,将会阻塞整个浏览器UI线程。在Chrome中,这将导致一个无响应的标签,在其他浏览器(如IE)中,整个浏览器将会出现锁定的情况。
因此,只支持异步网络调用,您被迫以异步方式编写应用程序。

2

Silverlight只生成异步服务调用。但是请查看这个CodeProject页面

当我开始使用Silverlight时,它首先让我感到困惑。然后我意识到应该将我的代码更改为与异步模型配合工作。您不希望在等待服务调用返回时阻塞UI线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接