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

C# 如何在运行时替换线程应该等待的WaitHandle,c#,multithreading,waithandle,C#,Multithreading,Waithandle,我想知道如何在运行时安全地更改线程应该等待的EventWaitHandle 例如,假设有两个线程(A和C)通过EventWaitHandles进行同步。A周期性地执行其工作,而C则等待,直到收到A发出的可以开始执行其工作的通知(例如,通过AutoResetEvent)。模式是A-C-A-C 稍后启动一个新线程(B)(例如,通过用户操作),其作业应在两个先前存在的线程之间以这种方式执行:a完成作业,然后向B发出信号,B完成后向C发出信号。现在模式为a-B-C-a-B-C 因此,在线程C等待与A共享

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

例如,假设有两个线程(A和C)通过EventWaitHandles进行同步。A周期性地执行其工作,而C则等待,直到收到A发出的可以开始执行其工作的通知(例如,通过AutoResetEvent)。模式是A-C-A-C

稍后启动一个新线程(B)(例如,通过用户操作),其作业应在两个先前存在的线程之间以这种方式执行:a完成作业,然后向B发出信号,B完成后向C发出信号。现在模式为a-B-C-a-B-C

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


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

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

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


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

如果您使用的是.NET 4.0,那么使用任务将使此操作更简单。基本上,你有三个任务,例如A“继续”和B“继续”和C。B在无事可做的情况下基本上什么也做不了,但在有事可做时会做。与其尝试从混合物中“插入”和“移除”B,它可以/应该始终在混合物中。这将使所有这些都不那么难维护。谢谢我尝试了你的第二个选择,它成功了。然而,在控制柄中,在获得锁之前,我必须向上一个控制柄发出信号,以避免死锁