[Route("testApi/order")]
public class TestController : ControllerBase
{
private static readonly object o = new object();
/// <summary>
/// 提交订单
/// </summary>
/// <param name="orderDto">订单实体</param>
/// <param name="code">第三方code</param>
/// <returns>是否成功</returns>
[HttpPost]
[Route("submitOrder")]
public bool EntryOrder(string code, [FromBody] dynamic orderDtosorderRequestDtos)
{
lock (o)
{
Task.Run(async () =>
{
await _orderService.EntryAllOrderAsync(orderDtosorderRequestDtos);
});
HttpContext.Response.StatusCode = StatusCodes.Status202Accepted;
}
return true;
}
}
本来是想用这种方式来处理并发,但是根本没有作用,原因在于 Task.Run 这里没有进行Await ,所以本次方法走完毕了,但是Task.run 里面的方法并没有走完,所以会导致数据不一致,所以使用Task run一定要注意 ,这里要使用await 才可以防止并发,但是lock在异步方法中无法使用,于是需要修改
修改后的方法,是异步的,然后是异步里面使用
Semaphore 类:Semaphore 类允许指定多个线程同时访问共享资源,可以用来限制并发访问的数量。
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
[Route("testApi/order")]
public class TestController : ControllerBase
{
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1);
/// <summary>
/// 提交订单
/// </summary>
/// <param name="orderDto">订单实体</param>
/// <param name="code">第三方code</param>
/// <returns>是否成功</returns>
[HttpPost]
[Route("submitOrder")]
public async Task<bool> EntryOrder(string code, [FromBody] dynamic orderDtosorderRequestDtos)
{
await _semaphore.WaitAsync();
try
{
await Task.Run(async () =>
{
await _orderService.EntryAllOrderAsync(orderDtosorderRequestDtos);
});
HttpContext.Response.StatusCode = StatusCodes.Status202Accepted;
}
finally
{
_semaphore.Release();
}
return true;
}
}
这样提高了系统的并发量,下面是一个小小的总结
_semaphore.Wait()和await _semaphore.WaitAsync()是实现同步和异步方式的获取信号量的方法。
_semaphore.Wait()是同步方法,它会阻塞当前线程直到获取到信号量。在同步方法中使用_semaphore.Wait()时,如果信号量当前可用,则会立即获取信号量并继续执行后续代码;如果信号量当前不可用,则会阻塞当前线程直到信号量可用,并获取信号量后继续执行后续代码。
await _semaphore.WaitAsync()是异步方法,它会以非阻塞的方式尝试获取信号量。在异步方法中使用await _semaphore.WaitAsync()时,如果信号量当前可用,则会立即获取信号量并继续执行后续代码;如果信号量当前不可用,则会释放当前线程并返回调用方,让调用方可以继续执行其他任务,直到信号量可用后再继续执行后续代码。
异步方法中可以使用_semaphore.Wait()来获取信号量,但是这样会阻塞当前线程,影响异步操作的性能和效率。推荐在异步方法中使用await _semaphore.WaitAsync()来以异步方式获取信号量,以提高异步操作的并发性和响应性能。