.net core 同步锁/异步锁

Lock是常用的同步锁,但是我们无法在Lock的内部实现异步调用,比如我们无法使用await。

如果在Lock中使用异步,则会报错

以下就是.net core中,同步锁/异步锁的用法

一、同步锁


        private static readonly object _lock = new object();

        ///同步锁
        public void TestLock()
        {
            lock (_lock)
               {
                //需要处理的业务
                Console.Write("输出内容");
                }
        }

二、异步锁



        private readonly AsyncLock _mutex = new AsyncLock();

        ///异步锁
        public async Task<bool>  TestAsyncLock()
        {
                using ( await _mutex.LockAsync())
                //锁保护区域
                {

                    var result = await _preSaleLawyerService.GetCustomerInfoAsync(new GetCustomerInfoRequest() { CustomerId = request.CustomerId });

                }
        }

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Core 中,可以使用 RabbitMQ、Azure Service Bus、Kafka 等消息队列作为 EventBus/EventQueue 的实现。以下是一个使用 RabbitMQ 的示例: 1. 安装 RabbitMQ 可以通过官网下载 RabbitMQ 安装包进行安装。 2. 安装 RabbitMQ.Client 在 .NET Core 项目中,可以通过 NuGet 安装 RabbitMQ.Client 包。 3. 配置 RabbitMQ 连接信息 在 appsettings.json 文件中,添加 RabbitMQ 连接信息: ``` { "RabbitMQ": { "HostName": "localhost", "UserName": "guest", "Password": "guest", "Port": 5672 } } ``` 4. 创建 EventBus/EventQueue 可以通过继承 IEventBus 接口来实现 EventBus,或者通过使用 RabbitMQ 的 API 创建 EventQueue。 以下是一个使用 RabbitMQ 的示例: ``` public class RabbitMQEventBus : IEventBus { private readonly IRabbitMQPersistentConnection _persistentConnection; private readonly ILogger<RabbitMQEventBus> _logger; private readonly IEventBusSubscriptionsManager _subsManager; private readonly string _exchangeName = "event_bus_exchange"; public RabbitMQEventBus(IRabbitMQPersistentConnection persistentConnection, ILogger<RabbitMQEventBus> logger, IEventBusSubscriptionsManager subsManager) { _persistentConnection = persistentConnection ?? throw new ArgumentNullException(nameof(persistentConnection)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _subsManager = subsManager ?? new InMemoryEventBusSubscriptionsManager(); } public void Publish(IntegrationEvent @event) { if (!_persistentConnection.IsConnected) { _persistentConnection.TryConnect(); } using (var channel = _persistentConnection.CreateModel()) { var eventName = @event.GetType().Name; var message = JsonConvert.SerializeObject(@event); var body = Encoding.UTF8.GetBytes(message); channel.ExchangeDeclare(exchange: _exchangeName, type: "direct"); var properties = channel.CreateBasicProperties(); properties.Persistent = true; channel.BasicPublish(exchange: _exchangeName, routingKey: eventName, basicProperties: properties, body: body); } } public void Subscribe<T, TH>() where T : IntegrationEvent where TH : IIntegrationEventHandler<T> { var eventName = typeof(T).Name; _logger.LogInformation($"Subscribing to event {eventName}"); _subsManager.AddSubscription<T, TH>(); } public void Unsubscribe<T, TH>() where T : IntegrationEvent where TH : IIntegrationEventHandler<T> { var eventName = typeof(T).Name; _logger.LogInformation($"Unsubscribing from event {eventName}"); _subsManager.RemoveSubscription<T, TH>(); } } ``` 5. 注册 EventBus/EventQueue 可以通过依赖注入的方式注册 EventBus/EventQueue。以下是一个使用 RabbitMQ 的示例: ``` services.AddSingleton<IRabbitMQPersistentConnection>(sp => { var logger = sp.GetRequiredService<ILogger<DefaultRabbitMQPersistentConnection>>(); var factory = new ConnectionFactory() { HostName = Configuration["RabbitMQ:HostName"], UserName = Configuration["RabbitMQ:UserName"], Password = Configuration["RabbitMQ:Password"], Port = int.Parse(Configuration["RabbitMQ:Port"]) }; return new DefaultRabbitMQPersistentConnection(factory, logger); }); services.AddSingleton<IEventBusSubscriptionsManager, InMemoryEventBusSubscriptionsManager>(); services.AddSingleton<IEventBus, RabbitMQEventBus>(); ``` 6. 发布/订阅事件 可以通过 IEventBus 接口的 Publish 和 Subscribe 方法来发布/订阅事件。以下是一个使用 RabbitMQ 的示例: ``` _eventBus.Subscribe<TestIntegrationEvent, TestIntegrationEventHandler>(); _eventBus.Publish(new TestIntegrationEvent() { Message = "Hello, world!" }); ``` 其中 TestIntegrationEvent 是一个继承自 IntegrationEvent 的事件类,TestIntegrationEventHandler 是一个实现了 IIntegrationEventHandler<TestIntegrationEvent> 接口的事件处理程序类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值