我已经开始研究需要与在Windows 7服务器上作为Windows服务运行的WCF服务进行通信的Windows 8商店应用。绑定是net.tcp,没有安全性(尚未)。我还进入了Package.appxmanifest文件并在我的主应用程序项目和单元测试项目中检查了“Internet(客户端)”和“专用网络(客户端和服务器)”。这在单元测试项目中运行良好,我可以与在Windows 7机器上运行的WCF服务进行通信,但是我无法在Windows 8应用程序本身中访问该服务。应用程序只挂起对webservice代理的调用。我只是缺少一些简单的权限/清单功能吗?
编辑:我实际上已经开始工作了。我的服务接口返回Task<IList<MyDataObj>>
,实现是异步的(在方法实现上使用了async
关键字)。当我在单元测试中运行它时,我会在返回的Task上调用GetItems()
,然后调用Wait()
。将此复制到应用程序,它将无法正常工作。当我在应用程序中更改我的代码并await
编辑任务调用时,调用了WCF服务。我现在的问题是,两种环境之间有什么区别以及什么会导致呼叫只是挂起?
答案 0 :(得分:2)
我解释了这种死锁情况on my blog和in an MSDN article。
简短摘要是await
(默认情况下)将捕获当前上下文并在该上下文中恢复async
方法。
在UI应用程序中,该上下文是UI上下文,但如果您通过调用Wait
来阻止该线程,则async
方法无法重新进入UI上下文以完成
在(大多数)单元测试框架中,上下文是一个线程池上下文,因此Wait
只阻塞一个线程池线程,而async
方法可以在另一个上继续。