【发布时间】:2012-01-18 15:23:35
【问题描述】:
我想做的是这个——
我想对服务进行代理调用,并通过异步回调在单独的线程上接收数据...棘手的部分是我想让前台线程休眠,直到检索到所有数据。
我之所以不使用同步方法来执行此操作,是因为我正在为 WCF 服务创建一个 API,该服务使用分页并以块的形式返回数据。
我希望我的客户端能够使用 Paging,但我不想将所有 Paging 回调公开给我的 API……我希望它看起来好像 API 公开了一个同步数据检索方法。
我尝试使用类方法和回调可访问的私有静态信号量(因为它与线程无关),并使用单个单元容量作为暂停执行的手段。
首先,我使用 Semaphore.WaitOne() 语句。
然后,我在前台线程中进行代理调用,服务创建一个处理数据检索的线程,并将控制权传递回客户端。
在客户端,我立即使用第二个 Semaphore.WaitOne() 语句。
这应该暂停前台线程执行,它确实如此。
然后,一旦在单独的线程上执行“分页完成”回调,我使用 Semaphore.Release()
但是前台线程从不遍历第二个 Semaphore 语句,它保持锁定状态,因此客户端冻结。
任何想法我做错了什么,或者是否有另一种更有效的锁定设计?
【问题讨论】:
-
我们需要看看你的代码,多线程是困难的东西(更不用说调试了)。
-
是在您第一次运行例程时发生冻结还是这是后续运行?第一个 Semaphore.WaitOne 调用只是为了将信号量计数器减少到 0 吗?
-
@sixlettervariables:我的代码太大(企业应用程序)无法在此处显示,无法全面了解 WCF 相互作用。我真的是想进行一个思想实验,看看是否有更好的物体适合这个练习。
-
@user377178:你是对的。将计数器减少到 0。
标签: c# multithreading synchronization semaphore wcf-callbacks