You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3.4 KiB
3.4 KiB
MaterialInStoreExecutor 优化记录
调度流程
RunLoopAsync (每 5 秒轮询 DB)
ExecuteAsync
查 DB: taskType=1, taskCategory=1, taskStatus=1 的待执行任务
每个任务启动一个 Thread(限 10 并发,TaskSemaphore)
ProcessOneAsync
任务状态 → 2
按 objId 串行遍历明细:
├─ AGV → DispatchAgvAsync
│ 1. POST /task/receive 下发
│ 2. 轮询 GET /task/status 每 2s
│ FINISHED/MANUALED → 完成
│ CANCELLED → 失败中断
│ WAIT → 下一明细是提升机?
│ → 轮询 GET /hoist/free 空闲提升机(每 1s)
│ → POST /task/dispatch 下发提升机
│ → POST /task/continue 通知 AGV 继续
├─ 提升机 → DispatchHoistAsync
│ 获取楼栋信号量(限 2 并发)
│ → POST /hoist/receive-pallet 启动
│ → 轮询 GET /hoist/wait-complete(每 2s)
│ → 完成
└─ 输送线 → DispatchConveyorAsync(目前直接返回 true)
成功 → detail.taskStatus = 3,继续下一条
失败 → detail.taskStatus = 1,中断整个任务
Thread.Join() — 等全部线程结束后才进入下一轮 DB 轮询
待优化项
1. [高] ExecuteAsync + Thread.Join 阻塞主循环 (:92-114)
现象:所有任务线程全部 Join 完成后才进入下一次 5 秒轮询。如果一个任务执行 10 分钟,期间新入库的任务完全不被调度。
建议:去掉 Thread.Join,RunLoopAsync 独立轮询,任务用 Task.Run 异步执行,互不阻塞。
2. [高] AGV 状态轮询无超时保护 (:200)
现象:while (true) 无限循环,AGV 永远不返回终态(FINISHED/MANUALED/CANCELLED)时线程永久卡死。
建议:加超时时间或最大重试次数。
3. [高] 空闲提升机轮询无超时 (:248)
现象:PLC 离线或提升机全忙时永远卡住。
建议:加超时,超时后返回失败。
4. [高] 等待提升机完成轮询无超时 (:393)
现象:同上。
建议:加超时。
5. [中] DbWriteLock 全局瓶颈 (:24)
现象:所有 DB 写操作共享同一把锁,10 个并发任务写状态时互相排队。
建议:改为每次 DB 操作用独立 Scope/Context,或使用 SqlSugar 的异步方法避免上下文冲突。
6. [中] new Thread + .GetAwaiter().GetResult() 浪费线程 (:92-111)
现象:每个任务消耗一个专用线程,内部全是 async/await,线程大部分时间在空等。绕过 CancellationToken 的异步传播。
建议:改为 Task.Run + await Task.WhenAll。
7. [低] HttpClient 重复创建 (:173, 362, 392)
现象:每次 HTTP 调用 new HttpClient,频繁创建可能导致 socket 耗尽。
建议:使用 IHttpClientFactory 或类级别静态 HttpClient 复用。
8. [低] DispatchConveyorAsync 空操作 (:419-422)
现象:输送线直接返回 true,逻辑未实现。
建议:待后续补充输送线调度逻辑。
优化记录
| 日期 | 内容 |
|---|---|
| 2026-06-23 | 初版记录,待测试后优化 |