ManualResetEvent
和AutoResetEvent
都是C#中用于同步線程的類,它們都實現了IEventWaitHandle
接口。它們的主要區別在于它們的工作方式和等待線程的行為。
ManualResetEvent:
ManualResetEvent
的初始狀態是“未設置”(即沒有信號)。Set()
方法時,它會設置事件的狀態為“已設置”(即發送信號),但只會影響一個等待的線程。其他等待的線程需要再次調用WaitOne()
方法才能收到信號。Reset()
方法時,它會重置事件的狀態為“未設置”(即取消信號),以便再次接收信號。AutoResetEvent:
AutoResetEvent
的初始狀態也是“未設置”(即沒有信號)。Set()
方法時,它會設置事件的狀態為“已設置”(即發送信號),并自動將所有等待的線程喚醒。當有線程調用WaitOne()
方法時,事件狀態會變為“未設置”(即取消信號),直到下一次調用Set()
方法。總結:
ManualResetEvent
只允許一個等待線程接收信號,而AutoResetEvent
會喚醒所有等待線程。ManualResetEvent
需要手動調用Reset()
方法重置事件狀態,而AutoResetEvent
在每次調用Set()
方法后自動重置事件狀態。