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.
wcs_core/docs/MaterialInStoreExecutor-优化记...

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.JoinRunLoopAsync 独立轮询,任务用 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 初版记录,待测试后优化