یکی از روشهای مقابله با مشکل فوق استفاده از کلاس
SemaphoreSlim می باشد که در
NET Framework 4.0 معرفی شده و در فضای نام System.Threading در دسترس میباشد. اگر اکشن متدهای شما به صورت async await ایجاد کرده اید بهتر هست ابتدا کلاس زیر را ایجاد نمایید:
using System;
using System.Threading;
using System.Threading.Tasks;
namespace MyApp
{
public class AsyncLock : IDisposable
{
private SemaphoreSlim _semaphoreSlim = new SemaphoreSlim(1, 1);
public async Task<AsyncLock> LockAsync()
{
await _semaphoreSlim.WaitAsync();
return this;
}
public void Dispose()
{
_semaphoreSlim.Release();
}
}
}
سپس به صورت زیر از آن استفاده کنید:
private static readonly AsyncLock _mutex = new AsyncLock();
using(await _mutex.LockAsync())
{
// Critical section... You can await here!
}
در این صورت تمامی درخواستهای به سمت سرور به ترتیب اجرا خواهند شد و دیگر مشکل فوق را نخواهیم داشت.