gpt4 book ai didi

c# - SemaphoreSlim 不会对并发请求进行排队,并且仍然允许双重预订

转载 作者:行者123 更新时间:2023-12-03 13:18:46 27 4
gpt4 key购买 nike

我在 .NET Core (2.2) 中使用 SemaphoreSlim 类时遇到问题,希望有人可以提供帮助。

我有一个 API 方法 (AddBooking),它将预订添加到数据库,此方法包括 3 个等待的存储库 AddAsync() 方法,这些方法将数据添加到 3 个单独的表。

我见过的此类类(class)的所有指南/文档的用法都略有不同,但似乎没有一个实际上对并发请求进行排队,从而导致双重预订。

单步执行代码时,当请求正在进行时,信号量的 CurrentValue 从 1 更改为 0,然后在调用 Release() 后返回到 1。

private readonly SemaphoreSlim _asyncLock;
_asyncLock = new SemaphoreSlim(1); // in the constructor

public async Task<BookingResponse> AddBooking(NewBooking newBooking)
{
await _asyncLock.WaitAsync().ConfigureAwait(false);

try
{
if (!IsWithinBookingTimeframe(newBooking))
return new BookingResponse { Result = false, Message = "Bookings must be between 6am and 8pm" };

AmendIfDayLightSavings(newBooking);

var bookingDetailsResponse = await CreateBookingDetails(newBooking);
if (!bookingDetailsResponse.Result)
return bookingDetailsResponse;

var parkingSpaceBookingResponse = await CreateParkingSpaceBooking(newBooking, bookingDetailsResponse.BookingDetails);
if (!parkingSpaceBookingResponse.Result)
return parkingSpaceBookingResponse;

await _unitOfWork.Save();
return new BookingResponse { Task = "AddBooking", Result = true, Message = "Booking added successfully", BookingDetails = bookingDetailsResponse.BookingDetails, ParkingSpaces = parkingSpaceBookingResponse.ParkingSpaces };
}
catch (Exception exception)
{
return new BookingResponse { Task = "AddBooking", Result = false, Message = $"Error adding booking to database: {exception}" };
}
finally
{
_asyncLock.Release();
}
}

我对此类的理解是,如果 CurrentCount 为 0,则后续请求将排队,直到信号量被释放并且 CurrentCount 递增到 1(从而允许下一个任务通过),但是同时发出请求仍然会导致双重预订。

最佳答案

您应该这样调用它:_asyncLock = new SemaphoreSlim(1, 1);

因为第一个参数是初始计数,第二个参数是最大计数。现在,您只需提供初始计数,在第一次调用 Release() 后,您可以无限制地调用它。

或者换句话说,第二个参数禁止超过 n 个并发调用。第一个参数表示在需要第一次调用 Release() 之前可以进行多少次调用。

关于c# - SemaphoreSlim 不会对并发请求进行排队,并且仍然允许双重预订,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57202240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com