C#在一个线程中锁定,调用在另一个线程中释放

时间:2016-11-29 00:37:20

标签: c# multithreading

我的情景:

  • 一些BackgroundWorkers来执行各种功能。
  • 其中一个,只有一次,必须先执行特殊工作才能继续并让其他工作完成他们的工作。

我使用Monitor.TryEnter:当它成立时执行此特殊工作(锁定成功);如果它是假的,将等待锁被释放。

问题是这项特殊工作是异步完成的。我有一个监听器,并且将调用CompletedSpecialWork方法,但是线程与执行Monitor.TryEnter的线程不同(即,线程持有(锁定)对象)。我需要一种方法能够向原始线程发送消息,要求释放该对象。

我尝试使用SynchronizationContext的静态对象,但是当我threadHoldingLock = SynchronizationContext.Current时,它为空(它是从能够持有锁的BackgroundWorker中调用的)。

我的问题是:从这个CompletedSpecialWork上下文/线程,如何通过Monitor.Exit向原始线程(持有锁)发送请求以释放锁定?我需要一种方法将Invoke发送到带有Monitor.Exit的原始线程。

2 个答案:

答案 0 :(得分:4)

就其本质而言,同步对象(如互斥锁)需要从获取锁定的同一线程中释放。如果这个要求不存在并且所有线程都可以随机释放所有线程中的所有锁,那么它几乎会使任何类型的同步成为崩溃和失败事件。

你应该查看Event对象来表示线程之间的简单脉冲。

答案 1 :(得分:3)

尝试使用ManualResetEvent或AutoResetEvent 这些可用于阻塞一个线程,然后(通过从正在运行的线程进入被阻塞线程的函数调用)允许块被重置。
它们是信号量之上的语法糖,但我喜欢简化的界面。 祝你好运!