外观
100Z代码评审
约 495 字大约 2 分钟
2026-01-09
目标和范围
- 目标是提升程序运行效率,核心是策略讨论及性能优化
- 范围: 针对高负债或高频率使用的模块,或已知瓶颈。非整个项目
- 坐标转换、焦点生成、路径规划
- 下位机通讯
- 扫描对焦
- 拍照识别
Checklist
- 业务设计策略(代码思想)
- 复杂度
- 内存、IO
- 代码效率
- 并发优化(锁、异步)
- 异步函数返回
void=> 导致异常被吞,严重点的程序崩溃无法溯源 - 不
await=> 任务还未完成已经return 导致逻辑未执行完成就中断引发难查找的异常 - 异步函数中
.Result、.Wait()异步变同步阻塞 直接死锁 - using中await using dispose了 await还在用
- 并行任务用串行(async只是不阻塞 不是多线程) 最好`Task.WhenAll(task1,task2,task3);
- 循环中await 别切回UI线程() ` await DoAsync(i).ConfigureAwait(false);
- 异步函数返回
1.对焦
10x对焦
2.移动
- Queue 非线程安全,需要依赖锁。
_waitingQueue不用静态,已经是单例了 会有风险
// 使用 SemaphoreSlim 实现串行化 + FIFO
// SemaphoreSlim 信号量≈独占锁 1,1表示互斥信号量同一时间只能一个线程进入
private readonly SemaphoreSlim _semaphore = new(1, 1);
// 超时时间(可配置)
private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(10);
public async Task<bool> ExecuteXYZAbsoluteMoveAsync(
MotorPulseDTO param,
CancellationToken cancellationToken = default)
{
// 1. 移动,极限检查
//...
// 2. 获取信号量(申请锁 加锁)
await _semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
try
{
// 3. 创建带超时的组合取消令牌
using var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
cts.CancelAfter(DefaultTimeout);
// 4. 执行移动(内部方法必须响应取消)
bool result = await ExecuteXYZAbsoluteMoveInternalAsync(
param.PulseDistanceX,
param.PulseDistanceY,
param.PulseDistanceZ,
cts.Token).ConfigureAwait(false);
// 5. 更新位置回调(在成功后)
param.PositionX?.Invoke(AxisStateManager.XLocation);
param.PositionY?.Invoke(AxisStateManager.YLocation);
param.PositionZ?.Invoke(AxisStateManager.ZLocation);
return result;
}
finally
{
// 6. 释放锁,唤醒下一个等待的进程
_semaphore.Release();
}
}
private Task<bool> ExecuteXYZAbsoluteMoveInternalAsync(
int? x, int? y, int? z, CancellationToken ct)
{
//..
cancellationToken.ThrowIfCancellationRequested()
//..
}