You must ensure that mutex is being accessed consistently on a certain thread. You could do that in a number of ways:
- Do not use await in the critical section during which you hold the mutex
- Invoke the mutex calls on a
TaskScheduler
that only has a single thread
That could look like this:
await Task.Factory.StartNew(() => mutex.WaitOne(), myCustomTaskScheduler);
Or, you use synchronous code and move everything to the thread-pool. If you only have access to an async version of DoSomething
, consider just calling Task.Wait
on its result. You’ll suffer a minor inefficiency here. Probably fine.