Skip to main content
 首页 » 编程设计

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

2024年01月22日26sky-heaven

我的场景:

  • 一些 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 被重置。
它们是信号量之上的语法糖,但我喜欢简化的界面。 祝你好运!