C# task 和Await 使用处理


    [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()来以异步方式获取信号量,以提高异步操作的并发性和响应性能。
 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值