From f2105eeb3a4fba2160bea977a66c0e964eadaa09 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Tue, 24 Mar 2026 10:46:40 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8=20SemaphoreSlim=20?= =?UTF-8?q?=E4=B8=B2=E8=A1=8C=E5=8C=96=E6=95=B0=E6=8D=AE=E5=BA=93=E5=86=99?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 多个后台线程同时写入数据库缓存 - SqlSugar Singleton 连接冲突 修复: - 添加静态 SemaphoreSlim(1, 1) 写入锁 - 所有数据库写入操作串行化 - 写入失败不影响主流程(内存缓存已生效) 流程: 1. 获取价格成功 → 写入内存缓存(ConcurrentDictionary,线程安全) 2. 后台线程排队等待写入锁 3. 串行写入数据库(避免连接冲突) 4. 写入失败只记录日志 --- .../Services/MarketDataService.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/AssetManager.Infrastructure/Services/MarketDataService.cs b/AssetManager.Infrastructure/Services/MarketDataService.cs index 7e03aa2..c84b5a0 100755 --- a/AssetManager.Infrastructure/Services/MarketDataService.cs +++ b/AssetManager.Infrastructure/Services/MarketDataService.cs @@ -27,6 +27,9 @@ public class MarketDataService : IMarketDataService // 静态 pending 请求字典(跨请求共享,防止并发请求同一股票) private static readonly ConcurrentDictionary>> _pendingPriceRequests = new(); + + // 静态写入锁(串行化数据库写入) + private static readonly SemaphoreSlim _writeLock = new(1, 1); public MarketDataService( ILogger logger, @@ -200,9 +203,10 @@ public class MarketDataService : IMarketDataService ExpiredAt = expireAt }, expireAt); - // 写入数据库缓存(Fire-and-Forget,失败不影响主流程) + // 写入数据库缓存(串行化,避免连接冲突) _ = Task.Run(async () => { + await _writeLock.WaitAsync(); try { await SavePriceCacheAsync(symbol, assetType, response, source); @@ -211,6 +215,10 @@ public class MarketDataService : IMarketDataService { _logger.LogWarning(ex, "[数据库缓存写入失败] Symbol={Symbol},忽略(内存缓存已生效)", symbol); } + finally + { + _writeLock.Release(); + } }); return response;