2011-02-18 51 views
0

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

假设有两个线程(A和C)通过EventWaitHandles同步。 A循环执行其工作,并且C等待,直到它从A收到通知它可以开始执行其工作(例如通过AutoResetEvent)。这种模式是ACAC的...

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

因此,在线程C正在等待与A共享的EventWaitHandle并且稍后应该有一个安全机制使得C在另一个EventWaitHandle上等待共享B.在我看来,棘手的部分是替换C使用的EventWaitHandle,因为一旦完成,我应该很容易启动B,它将使用EventWaitHandle等待A作业和EventWaitHandle发送C作业信号。该机制还应该提供一种方法来安全地卸载线程B并返回到只有线程A和C正在工作的初始状态。

有没有一种安全的方法来完成这与EventWaitHandle?如果没有,任何其他建议,将不胜感激。

+0

如果您使用的是.NET 4.0,那么使用任务将会使这个更简单。从本质上讲,你有三个任务,A“继续”B和B“继续”C“。在没有任何事情要做的情况下,B本质上什么都不做,但是当有时候会做某事。而不是试图从混音中“插入”和“删除”B,它可能/应该始终处于混音中。这将使这一切都变得难以维持。 – 2011-02-18 10:34:39

回答

0

如果任务A知道更改,则让任务C拥有该事件。如果C是下一个,任务A就向任务C的事件发出信号,如果任务B是下一个任务,则向任务B的事件发出信号。

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

+0

谢谢我尝试了你的第二选择,它工作。然而,改变句柄,在获得锁之前,我必须发信号通知前一个句柄以避免死锁 – 2011-02-19 08:51:28

0

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

+0

这似乎是一个可以稍后尝试的优雅解决方案,谢谢! – 2011-02-19 08:52:12