0

我已经开始开发一个 Windows 8 商店应用程序,该应用程序需要与在 Windows 7 服务器上作为 Windows 服务运行的 WCF 服务进行通信。绑定是 net.tcp,还没有安全性。我还进入了 Package.appxmanifest 文件,并在我的主应用程序项目和单元测试项目中检查了“Internet(客户端)”和“私有网络(客户端和服务器)”。这在单元测试项目中运行良好,我可以与在 Windows 7 机器上运行的 WCF 服务进行通信,但我无法在 Windows 8 应用程序本身中访问该服务。应用程序只是挂起对 web 服务代理的调用。我只是错过了一些简单的权限/清单功能吗?

编辑:我实际上已经开始工作了。我的服务接口返回 aTask<IList<MyDataObj>>并且实现是异步的(async在方法实现上使用关键字)。当我在单元测试中运行它时,我会调用GetItems(),然后Wait()在返回的任务上调用。将其复制到应用程序,它不会工作。当我更改应用程序中的代码并改为await编辑任务调用时,调用是对 WCF 服务进行的。我现在的问题是,这两种环境有什么区别,什么会导致调用挂起?

4

1 回答 1

2

我在我的博客MSDN 文章中解释了这种死锁情况。

简短的总结是await(默认情况下)将捕获当前上下文并async在该上下文中恢复方法。

在 UI 应用程序中,该上下文是 UI 上下文,但如果您通过调用来阻塞线程Wait,则该async方法无法重新进入 UI 上下文以完成。

在(大多数)单元测试框架中,上下文是线程池上下文,因此Wait只有阻塞一个线程池线程,并且该async方法可以在另一个线程上继续。

于 2013-05-19T21:56:48.987 回答