我想做的是这个——
我想对服务进行代理调用,并通过异步回调在单独的线程上接收数据......棘手的部分是我想让前台线程休眠,直到检索到所有数据。
我不使用同步方法来执行此操作的原因是因为我正在为 WCF 服务创建一个 API,该服务使用 Paging 并以块的形式返回数据。
我希望我的客户端能够使用 Paging,但我不想将所有 Paging 回调公开给我的 API……我希望它看起来好像 API 公开了一个同步数据检索方法。
我尝试使用类方法和回调可以访问的私有静态信号量(因为它与线程无关),并使用单个单元容量作为暂停执行的手段。
首先,我使用 Semaphore.WaitOne() 语句。
然后,我在前台线程中进行代理调用,服务创建一个处理数据检索的线程,并将控制权传递回客户端。
在客户端,我立即使用第二个 Semaphore.WaitOne() 语句。这应该暂停前台线程执行,它确实如此。然后,一旦在单独的线程上执行“分页完成”回调,我使用 Semaphore.Release() 但前台线程永远不会遍历第二个 Semaphore 语句,它保持锁定状态,因此客户端冻结。
任何想法我做错了什么,或者是否有另一种更有效的锁定设计?