【问题标题】:Multi-threading synchronization using wide scope lock with WCF callbacks使用带有 WCF 回调的宽范围锁的多线程同步
【发布时间】: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


【解决方案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() 的详细信息。如果您的任务失败,您需要为一些例外情况做好准备。

【讨论】:

  • 听起来不错,remarkrm,我会试一试。在我的研究中,我还发现了“EventWaitHandle”,它看起来也很有前途。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
相关资源
最近更新 更多