为何WCF自动生成代理含同步方法?异步服务代理生成问题咨询
关于WCF客户端生成同步方法的问题解答
这问题我之前也碰到过,给你详细拆解下原因和解决办法:
为什么会生成同步版本?
VS的服务引用生成工具(底层是SvcUtil.exe)默认是「多版本通吃」的——不管你的服务端是同步还是异步实现,它都会默认生成同步方法、基于Task的异步方法、甚至旧版APM模式(Begin/End开头)的方法三套调用接口。
另外还有个可能:如果你之前添加过旧的同步版服务引用,VS可能缓存了旧的元数据,导致更新引用时没完全覆盖旧代码,这种情况建议先删除旧的服务引用,清理项目的bin/obj目录后再重新添加。
如何禁止生成同步版本?
有两种靠谱的方式可以控制生成的方法类型:
方式1:通过服务引用可视化设置
- 在添加/更新服务引用的弹窗里,点击右下角的「高级」按钮
- 在弹出的「服务引用设置」窗口中:
- 确保勾选「生成基于Task的异步操作」(这对应你服务端的
Task返回异步方法) - 取消勾选「生成同步操作」(这就是关键!取消后就不会生成同步版方法了)
- 如果不需要旧版的事件驱动异步方法,也可以取消「生成基于事件的异步操作」
- 确保勾选「生成基于Task的异步操作」(这对应你服务端的
- 点击确定后重新生成服务引用,此时客户端代码就只会有返回
Task的异步方法(命名应该会对应你的MyServiceAsync)
方式2:使用SvcUtil.exe命令行(更灵活)
如果你习惯用命令行或者需要自动化生成客户端代码,可以直接调用VS自带的SvcUtil.exe:
打开VS的开发者命令提示符,执行以下命令:
svcutil.exe /async /nosync http://你的服务地址/MyService.svc
/async:指定生成基于Task的异步方法/nosync:禁止生成同步方法
生成的代码文件里就只有异步版本的调用方法了。
额外注意事项
- 不管用哪种方式,都建议先彻底删除旧的服务引用文件夹,清理项目的bin和obj目录,避免缓存的旧代码干扰新生成的内容
- 确保服务端的契约是正确定义的异步方法(比如返回
Task<T>),这样客户端生成的异步方法才能正确对应
内容的提问来源于stack exchange,提问作者Ish Thomas
相关产品推荐
相关产品推荐

