我有一个webApi,它可以获取请求并使用XPO执行数据。根据我的业务逻辑,为避免在同一数据库表上发生冲突,必须按顺序逐个执行每个请求。
老实说,我什么都还没尝试。我对Asp.Net WebAPI的异步方面有些困惑。
下面的代码是在Custom DelegatingHandler中创建响应的一部分。执行base.SendAsync(request, cancellationToken)
方法后,我的业务逻辑从相关的System.Web.Http.ApiController
类开始。
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
// some logic on request like isUserGranted etc.
//
//
var response = await base.SendAsync(request, cancellationToken);
return buildApiResponse(request, response);
}
可能我在这里有一个误解。如果队列上有请求,我需要等到当前响应完成后才能处理下一个请求。我已经读过有关ConcurrentQueue的信息,但无法实现这种情况。
谢谢。
答案 0 :(得分:1)
根据我的业务逻辑,为避免在同一数据库表上发生冲突,必须按顺序逐个执行每个请求。
这是“悲观锁定”,由于可伸缩性原因,通常认为它不好。如果可能,将业务需求更改为使用“乐观锁定”。
但是,如果您确实要使用悲观锁定,则可以使用异步锁定(SemaphoreSlim
)强制一次执行以下行为:
private static readonly SemaphoreSlim Mutex = new SemaphoreSlim(1);
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
// some logic on request like isUserGranted etc.
await Mutex.WaitAsync();
try
{
var response = await base.SendAsync(request, cancellationToken);
return buildApiResponse(request, response);
}
finally
{
Mutex.Release();
}
}