Why no AutoResetEventSlim in BCL?

前端 未结 2 1524
南旧
南旧 2020-12-16 09:31

Why isn\'t there an AutoResetEventSlim class in BCL?

Can it be simulated using ManualResetEventSlim?

2条回答
  •  佛祖请我去吃肉
    2020-12-16 10:12

    I was bugged by this fact as well. However, it appears that you can simulate an AutoResetEvent(Slim) using a simple SemaphoreSlim with a special configuration:

    SemaphoreSlim Lock = new SemaphoreSlim( 1, 1 );
    

    In the constructor, the first parameter defines the initial state of the semaphore: 1 means that one thread may enter, 0 that the semaphore has to be released first. So new AutoResetEvent( true ) translates to new SemaphoreSlim( 1, 1 ) and new AutoResetEvent( false ) translates to new SemaphoreSlim( 0, 1 ) respectively.

    The second parameter defines the maximum number of threads that may enter the semaphore concurrently. Setting it to 1 lets it behave like an AutoResetEvent.

    One other nice thing about the SemaphoreSlim is that with the new async/await pattern in 4.5 the class has received a .WaitAsync() method which can be awaited. So there is no need to manually create an awaitable wait primitive in this case any more.

    Hope this helps.

提交回复
热议问题