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.set | AerTaskSetExecuteMode | 设置任务执行模式 |
Feedhold | AerMoveFeedhold/Release | 紧急暂停/恢复运动 |
State.get | AerTaskGetTaskState | 获取当前状态 |
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. 改进建议
-
线程安全增强
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 | 依赖关系 | 封装底层硬件句柄 |
总结
该类的设计亮点:
-
明确的职责边界:分离任务控制、状态管理和回调处理
-
类型安全的硬件交互:通过枚举和包装方法避免魔术数值
-
资源高效利用:延迟初始化回调容器
典型应用于:
-
工业控制系统的多任务管理
-
需要精确状态监控的自动化流程
-
实时性要求较高的运动控制场景
通过扩展异步支持和事件机制,可进一步提升其在现代工业软件中的适用性
可执行任务单元Task类设计解析

787

被折叠的 条评论
为什么被折叠?



