0

我想知道如何在运行时安全地更改线程应该等待的 EventWaitHandle。

例如,假设有两个线程(A 和 C)通过 EventWaitHandles 同步。A 循环地完成它的工作,C 等待直到它收到来自 A 的通知,它可以开始做它的工作(例如,通过 AutoResetEvent)。图案是ACAC...

稍后启动一个新线程(B)(例如通过用户操作),它的工作应该在两个预先存在的线程之间以这种方式执行:A 完成它的工作,然后向 B 发出信号,一旦 B 完成它就向 C 发出信号。现在模式是ABCABC...

因此,在线程 C 等待与 A 共享的 EventWaitHandle 之前,应该有一个安全机制使 C 等待与 B 共享的另一个 EventWaitHandle。在我看来,棘手的部分是替换 C 使用的 EventWaitHandle,因为一旦这个完成后,我应该能够轻松启动 B,它将使用 EventWaitHandle 等待 A 作业,并使用 EventWaitHandle 发出 C 作业信号。该机制还应该提供一种安全卸载线程 B 并返回到只有线程 A 和 C 正在工作的初始情况的方法。

使用 EventWaitHandle 是否有安全的方法来完成此任务?如果没有,任何其他建议将不胜感激。

4

2 回答 2

0

您是否考虑过实现某种调度程序,其中线程可以使用句柄注册(取消注册)以启动和发出完成信号。然后调度程序通过设置适当的启动事件来启动下一个线程,并在前一个线程设置完成事件时继续下一个线程。

于 2011-02-18T09:58:55.700 回答
0

如果任务 A 知道更改,则让任务 C 拥有该事件。任务 A 通知任务 C 的事件,如果 C 是下一个,或者任务 B 的事件,如果任务 B 是下一个。

或者,使用与更改任何其他共享数据相同的机制:在对句柄的所有访问中获取互斥锁。例如,任务 C 获取锁,读取句柄,释放锁,等待句柄。要更改它,您需要 UI 线程获取锁、更改句柄、释放锁。

于 2011-02-18T10:04:30.503 回答