What would be the async (awaitable) equivalent of AutoResetEvent?
If in the classic thread synchronization we would use something like this:
AutoResetEvent signal = new AutoResetEvent(false); void Thread1Proc() { //do some stuff //.. //.. signal.WaitOne(); //wait for an outer thread to signal we are good to continue //do some more stuff //.. //.. } void Thread2Proc() { //do some stuff //.. //.. signal.Set(); //signal the other thread it's good to go //do some more stuff //.. //.. }
I was hoping that in the new async way of doing things, something like this would come to be:
SomeAsyncAutoResetEvent asyncSignal = new SomeAsyncAutoResetEvent(); async void Task1Proc() { //do some stuff //.. //.. await asyncSignal.WaitOne(); //wait for an outer thread to signal we are good to continue //do some more stuff //.. //.. } async void Task2Proc() { //do some stuff //.. //.. asyncSignal.Set(); //signal the other thread it's good to go //do some more stuff //.. //.. }
I've seen other custom made solutions, but what I've managed to get my hands on, at some point in time, still involves locking a thread. I don't want this just for the sake of using the new await syntax. I'm looking for a true awaitable signaling mechanism which does not lock any thread.
Is it something I'm missing in the Task Parallel Library?
EDIT: Just to make clear: SomeAsyncAutoResetEvent is an entirely made up class name used as a placeholder in my example.
AutoResetEvent remains signaled until a single waiting thread is released, and then automatically returns to the non-signaled state. If no threads are waiting, the state remains signaled indefinitely. If a thread calls WaitOne while the AutoResetEvent is in the signaled state, the thread does not block.
WaitAny(WaitHandle[], TimeSpan, Boolean) Waits for any of the elements in the specified array to receive a signal, using a TimeSpan to specify the time interval and specifying whether to exit the synchronization domain before the wait. WaitOne() Blocks the current thread until the current WaitHandle receives a signal.
If you want to build your own, Stephen Toub has the definitive blog post on the subject.
If you want to use one that's already written, I have one in my AsyncEx library. AFAIK, there's no other option as of the time of this writing.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With