可执行任务单元Task类的设计

可执行任务单元Task类设计解析
public class Task : INamed<TaskId>
{
    private readonly Controller controller;

    private readonly int taskNumber;

    private readonly ControllerHandle taskControllerHandle;

    private readonly Program program;

    private TaskCallbackContainer taskCallbacks;

    public TaskId Name => (TaskId)taskNumber;

    internal int Number => taskNumber;

    internal ControllerHandle TaskControllerHandle => taskControllerHandle;

    public TaskExecutionMode ExecutionMode
    {
        get
        {
            return (TaskExecutionMode)controller.Tasks.GetSingleItemForSingleTask(Name, TaskDataSignal.ExecutionMode);
        }
        set
        {
            ExceptionResolver.ResolveThrow(controller, Wrapper.AerTaskSetExecuteMode(taskControllerHandle.Value, taskNumber, (int)value));
        }
    }

    public Program Program => program;

    public TaskCallbackContainer Callbacks
    {
        get
        {
            if (taskCallbacks == null)
            {
                taskCallbacks = new TaskCallbackContainer(controller, (TaskId)taskNumber);
            }

            return taskCallbacks;
        }
    }

    public TaskStatus Status => new TaskStatus(controller.Tasks.GetAllStatusForSingleTask((TaskId)taskNumber));

    public TaskState State
    {
        get
        {
            int pdwTaskState_ = 0;
            ExceptionResolver.ResolveThrow(controller, Wrapper.AerTaskGetTaskState(taskControllerHandle.Value, taskNumber, ref pdwTaskState_));
            return (TaskState)pdwTaskState_;
        }
    }

    internal Task(Controller controller, int taskNumber)
    {
        this.controller = controller;
        this.taskNumber = taskNumber;
        IntPtr phAerCtrl_ = IntPtr.Zero;
        int pdwConfigMode_ = 0;
        ExceptionResolver.ResolveThrow(this.controller, Wrapper.AerSysConnect(ref phAerCtrl_, ref pdwConfigMode_));
        taskControllerHandle = new ControllerHandle(phAerCtrl_);
        program = new Program(controller, this);
    }

    public void Retrace(bool retraceEnabled)
    {
        ExceptionResolver.ResolveThrow(controller, Wrapper.AerTaskSetRetraceMode(taskControllerHandle.Value, taskNumber, retraceEnabled ? 1 : 0));
    }

    public void Feedhold(bool feedholdEnabled)
    {
        if (feedholdEnabled)
        {
            ExceptionResolver.ResolveThrow(controller, Wrapper.AerMoveFeedhold(taskControllerHandle.Value, taskNumber));
        }
        else
        {
            ExceptionResolver.ResolveThrow(controller, Wrapper.AerMoveRelease(taskControllerHandle.Value, taskNumber));
        }
    }
}

以下是针对 Task 类的全面解析,结合其设计模式和实现细节:


1. 核心功能

该类表示一个 可执行任务单元,主要职责包括:

  • 任务状态管理:执行模式、状态监控、暂停/继续控制

  • 程序关联:绑定到具体的 Program 对象

  • 回调处理:通过 TaskCallbackContainer 管理异步事件

  • 硬件交互:通过底层 ControllerHandle 与控制器通信


2. 关键设计分析

(1)接口实现
public class Task : INamed<TaskId> {
    public TaskId Name => (TaskId)taskNumber; // 显式实现INamed接口
}
  • 强类型命名TaskId 枚举确保任务名称的类型安全

  • 设计一致性:符合 INamed<T> 契约,便于集合管理

(2)硬件交互模式
方法底层调用功能
ExecutionMode.setAerTaskSetExecuteMode设置任务执行模式
FeedholdAerMoveFeedhold/Release紧急暂停/恢复运动
State.getAerTaskGetTaskState获取当前状态

 

public TaskState State {
    get {
        int state = 0;
        Wrapper.AerTaskGetTaskState(handle, taskNumber, ref state);
        return (TaskState)state;
    }
}

 

(3)状态封装
  • 复合状态对象

public TaskStatus Status => new TaskStatus(GetAllStatusForSingleTask(Name));
  • 将原始状态数据封装为强类型对象

  • 线程安全:所有硬件访问通过控制器实例同步

(4)延迟初始化
public TaskCallbackContainer Callbacks {
    get {
        if (taskCallbacks == null) 
            taskCallbacks = new TaskCallbackContainer(...);
        return taskCallbacks;
    }
}
  • 按需创建:首次访问回调容器时才初始化

  • 资源优化:避免无回调需求时的内存开销


3. 生命周期管理

(1)初始化流程

 

2)资源释放

虽然未显示实现 IDisposable,但通过 ControllerHandle 管理原生资源:

internal class ControllerHandle : IDisposable {
    private IntPtr handle;
    public void Dispose() => Wrapper.AerSysDisconnect(handle);
}

4. 典型使用场景

(1)任务控制
// 创建并配置任务
var task = new Task(controller, 1);
task.ExecutionMode = TaskExecutionMode.Continuous;

// 紧急暂停
task.Feedhold(true);

// 状态监控
if (task.State == TaskState.Error) {
    Console.WriteLine($"Task {task.Name} failed");
}
(2)回调注册
task.Callbacks.Add(1, (sender, args) => {
    Console.WriteLine($"Callback triggered with {args.Arguments}");
});

5. 改进建议

  1. 线程安全增强

private readonly object _stateLock = new object();
public TaskState State {
    get {
        lock (_stateLock) {
            int state = 0;
            Wrapper.AerTaskGetTaskState(...);
            return (TaskState)state;
        }
    }
}

DI 支持

public interface ITaskFactory {
    Task Create(int taskNumber);
}

异步API

public async Task FeedholdAsync(bool enabled) {
    await Task.Run(() => Feedhold(enabled));
}

状态变更事件

public event EventHandler<TaskStateChangedEventArgs> StateChanged;

6. 关联类型分析

关联类协作方式功能
Program组合关系管理任务关联的程序代码
TaskCallbackContainer延迟初始化处理异步回调事件
ControllerHandle依赖关系封装底层硬件句柄

总结

该类的设计亮点:

  • 明确的职责边界:分离任务控制、状态管理和回调处理

  • 类型安全的硬件交互:通过枚举和包装方法避免魔术数值

  • 资源高效利用:延迟初始化回调容器

典型应用于:

  1. 工业控制系统的多任务管理

  2. 需要精确状态监控的自动化流程

  3. 实时性要求较高的运动控制场景

通过扩展异步支持和事件机制,可进一步提升其在现代工业软件中的适用性

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值