public class ControlCenter
{
private Controller controller;
private List<IDataPoller> pollers = new List<IDataPoller>();
private DiagPacketPoller diagPacketPoller;
private TaskStatesPoller taskStatesPoller;
public DiagPacketPoller Diagnostics => diagPacketPoller;
public TaskStatesPoller TaskStates => taskStatesPoller;
internal ControlCenter(Controller controller)
{
this.controller = controller;
diagPacketPoller = new DiagPacketPoller(this.controller);
pollers.Add(diagPacketPoller);
taskStatesPoller = new TaskStatesPoller(this.controller);
pollers.Add(taskStatesPoller);
}
public void UnsubscribeAll()
{
foreach (IDataPoller poller in pollers)
{
poller.UnsubscribeAll();
}
}
internal void Disable()
{
foreach (IDataPoller poller in pollers)
{
poller.Suspend();
}
}
}
这段代码定义了一个 ControlCenter
类,它主要负责管理和协调多个数据轮询器(IDataPoller
)的工作,包括诊断数据包轮询器(DiagPacketPoller
)和任务状态轮询器(TaskStatesPoller
)。以下是详细解析:
1. 核心成员
成员 | 类型 | 说明 |
---|---|---|
controller | Controller | 控制器实例,用于与底层系统交互 |
pollers | List<IDataPoller> | 存储所有数据轮询器的列表 |
diagPacketPoller | DiagPacketPoller | 诊断数据包轮询器,用于获取诊断信息 |
taskStatesPoller | TaskStatesPoller | 任务状态轮询器,用于监控任务状态 |
Diagnostics | 属性 | 公开 diagPacketPoller 的只读访问 |
TaskStates | 属性 | 公开 taskStatesPoller 的只读访问 |
2. 关键方法
(1) 构造函数 ControlCenter(Controller controller)
-
初始化
controller
和两个轮询器:
diagPacketPoller = new DiagPacketPoller(this.controller);
taskStatesPoller = new TaskStatesPoller(this.controller);
将轮询器添加到 pollers
列表统一管理:
pollers.Add(diagPacketPoller);
pollers.Add(taskStatesPoller);
(2) UnsubscribeAll()
-
作用:取消所有轮询器的订阅(停止数据监听)。
-
实现:遍历
pollers
并调用每个轮询器的UnsubscribeAll()
方法。
foreach (IDataPoller poller in pollers)
{
poller.UnsubscribeAll();
}
(3) Disable()
-
作用:暂停所有轮询器(临时停止数据采集)。
-
实现:遍历
pollers
并调用每个轮询器的Suspend()
方法。
foreach (IDataPoller poller in pollers)
{
poller.Suspend();
}
3. 设计分析
(1) 依赖注入
-
通过构造函数传入
Controller
,确保ControlCenter
不直接创建依赖项,提高可测试性和灵活性。
(2) 统一管理轮询器
-
所有轮询器均实现
IDataPoller
接口,通过pollers
列表统一管理,便于扩展(未来可新增其他轮询器)。
(3) 资源释放控制
-
UnsubscribeAll()
和Disable()
提供了对轮询器的生命周期控制:-
UnsubscribeAll
:彻底取消订阅(可能用于关闭场景)。 -
Disable
:临时暂停(可能用于休眠或节能模式)。
-
(4) 只读属性
-
Diagnostics
和TaskStates
以只读方式暴露内部轮询器,避免外部直接修改实例。
4. 潜在改进建议
(1) 线程安全性
如果轮询器在多线程环境下运行,建议:
-
使用线程安全集合(如
ConcurrentBag<IDataPoller>
)。 -
在
UnsubscribeAll
和Disable
中加锁:
private readonly object _lock = new object();
public void UnsubscribeAll()
{
lock (_lock)
{
foreach (var poller in pollers)
{
poller.UnsubscribeAll();
}
}
}
(2) 接口扩展
IDataPoller
应明确定义必要方法(如 UnsubscribeAll
和 Suspend
),例如:
public interface IDataPoller
{
void UnsubscribeAll();
void Suspend();
void Resume(); // 可选:增加恢复功能
}
(3) 异常处理
在遍历 pollers
时增加异常捕获:
foreach (var poller in pollers.ToArray()) // ToArray 避免遍历时修改集合
{
try
{
poller.UnsubscribeAll();
}
catch (Exception ex)
{
Logger.Error($"Failed to unsubscribe {poller.GetType()}", ex);
}
}
(4) IDisposable 支持
如果轮询器占用非托管资源,可实现 IDisposable
:
public class ControlCenter : IDisposable
{
public void Dispose()
{
UnsubscribeAll();
}
}
5. 典型使用场景
var controller = new Controller();
var controlCenter = new ControlCenter(controller);
// 获取诊断数据
var diagnostics = controlCenter.Diagnostics.GetLatestData();
// 临时禁用轮询
controlCenter.Disable();
// 关闭时释放资源
controlCenter.UnsubscribeAll();
总结
-
核心职责:集中管理数据轮询器,提供统一的启动/暂停/销毁接口。
-
优点:依赖注入、接口抽象、易于扩展。
-
适用场景:需要后台轮询数据的系统(如设备监控、任务调度等)。