如何在运行时替换线程应该等待的WaitHandle

时间:2011-02-18 09:40:33

标签: c# multithreading waithandle

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

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

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

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

使用EventWaitHandle有没有一种安全的方法来实现这一目标?如果没有,任何其他建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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