0

我想做的是这个——

我想对服务进行代理调用,并通过异步回调在单独的线程上接收数据......棘手的部分是我想让前台线程休眠,直到检索到所有数据。

我不使用同步方法来执行此操作的原因是因为我正在为 WCF 服务创建一个 API,该服务使用 Paging 并以块的形式返回数据。
我希望我的客户端能够使用 Paging,但我不想将所有 Paging 回调公开给我的 API……我希望它看起来好像 API 公开了一个同步数据检索方法。

我尝试使用类方法和回调可以访问的私有静态信号量(因为它与线程无关),并使用单个单元容量作为暂停执行的手段。

首先,我使用 Semaphore.WaitOne() 语句。
然后,我在前台线程中进行代理调用,服务创建一个处理数据检索的线程,并将控制权传递回客户端。
在客户端,我立即使用第二个 Semaphore.WaitOne() 语句。这应该暂停前台线程执行,它确实如此。然后,一旦在单独的线程上执行“分页完成”回调,我使用 Semaphore.Release() 但前台线程永远不会遍历第二个 Semaphore 语句,它保持锁定状态,因此客户端冻结。

任何想法我做错了什么,或者是否有另一种更有效的锁定设计?

4

1 回答 1

1

如果您要完成的是让前台线程等待数据收集线程,您可能需要考虑使用任务,这将使您能够轻松地完成您在此处描述的内容。

System.Threading.Tasks:http: //msdn.microsoft.com/en-us/library/dd235608.aspx

一些代码:

Task t = new Task(somethingToDo);
// Fire off the new task
t.Start();

// Wait for the task to finish...
t.Wait();

// Do something else...

请务必查看文档中 t.Wait() 的详细信息。如果您的任务失败,您需要为一些例外情况做好准备。

于 2012-01-18T16:11:44.267 回答