Вы можете использовать SemaphoreSlim
, который является блокировкой с методом WaitAsync
(и который не против того, чтобы вы выпустили его в другом потоке для тот, на котором вы его приобрели).
private readonly SemaphoreSlim methodLock = new SemaphoreSlim(1, 1);
public async Task SomeMethod()
{
await methodLock.WaitAsync();
try
{
...
}
finally
{
methodLock.Release();
}
}
Если вы чувствуете себя авантюрным, вы можете написать метод расширения для SemaphoreSlim
, позволяющий вам, например:
public async Task SomeMethod()
{
using (await methodLock.WaitDisposableAsync())
{
...
}
}
Be осторожно: SemaphoreSlim
является не рекурсивным (и не может быть). Это означает, что если ваш метод рекурсивный, он заходит в тупик.