我的场景:
- 一些
BackgroundWorkers来执行各种功能。 - 其中一个,而且只有一次,必须先执行一项特殊工作,然后才能继续并让其他工作完成他们的工作。
我正在使用 Monitor.TryEnter:当它为真时(锁定成功)执行此特殊工作;当它为假时,将等待锁被释放。
问题是这个特殊的工作是异步完成的。我有一个监听器,CompletedSpecialWork方法会被调用,但是Thread不同于执行Monitor.TryEnter的Thread(即Thread holding(locking ) 物体)。我需要一种能够向原始线程发送消息以请求释放对象的方法。
我试图拥有一个 SynchronizationContext 的静态对象,但是当我执行 threadHoldingLock = SynchronizationContext.Current 时,它是空的(它是从 BackgroundWorker 调用的,它能够持有锁)。
我的问题是:从这个 CompletedSpecialWork 上下文/线程,我如何向原始线程(持有锁)发送请求以通过 Monitor.Exit 释放锁>?我需要一种方法来将 Invoke 发送到带有 Monitor.Exit 的原始线程。
请您参考如下方法:
尝试使用 ManualResetEvent 或 AutoResetEvent。
这些可用于阻塞一个线程,然后(通过从正在运行的线程调用函数调用被阻塞的线程)允许该 block 被重置。
它们是信号量之上的语法糖,但我喜欢简化的界面。 祝你好运!
