宿主生命周期
宿主负责打开通道、运行后台服务,并在退出时按相反顺序释放资源。
顺序
ZeusHost.Create:登记通道、设备和点定义,此时还不打开端口。点快照可查询,但Value/UpdatedAt为空。StartAsync/ConnectAsync:按注册顺序打开通道并开始采集。required通道打开失败会终止启动并回滚已打开通道;optional/degraded通道打开失败会记入日志,宿主继续启动并交给自动重连恢复。- 运行期间通过
Channels、Devices、Points访问对象;采集循环按间隔轮询。 StopAsync/DisconnectAsync或DisposeAsync:按相反顺序关闭通道。点表保留最后一次快照。
await using var app = ZeusHost.Create(builder =>
{
builder.AddVirtualChannel("meter");
});
await app.StartAsync();
// ... 业务 ...
await app.StopAsync();
桌面上位机也可以使用设备会话命名:
await app.ConnectAsync();
Console.WriteLine(app.Session.State); // Online / Reconnecting / Offline ...
await app.DisconnectAsync();
状态栏可以直接读诊断对象:
var diagnostics = app.Diagnostics.Snapshot();
StatusText.Text =
$"Cycle {diagnostics.CurrentCycle} TX {diagnostics.TransmitCount}/{diagnostics.TransmittedBytes}B RX {diagnostics.ReceiveCount}/{diagnostics.ReceivedBytes}B";
说明
builder.Services是标准IServiceCollection,可以注册自己的服务。builder.Logging、builder.Configuration、builder.Environment分别对应 Generic Host 的日志、配置和环境。app.Services在构建完成后可用于解析服务。- 通道默认启动策略是
required。现场允许降级运行的线路,应在 JSON 里设置startup: "optional"或startup: "degraded",或在运行时新增通道时传入ChannelStartupMode.Optional/ChannelStartupMode.DegradedAllowed。 StopAsync会暂停采集与自动重连,并关闭通道;再次StartAsync会重新打开通道。释放进程资源请DisposeAsync。ConnectAsync/DisconnectAsync与StartAsync/StopAsync等价,只是命名更适合界面按钮和状态栏。app.Session.State表示设备会话状态:Idle、Connecting、Online、Reconnecting、Faulted、Offline。app.Diagnostics汇总当前周期、最近错误、TX/RX 报文次数、TX/RX 字节数和重连次数,可订阅Changed刷新状态栏。app.IsRunning表示用户是否已启动宿主,而不是底层 Generic Host 是否还活着。- 桌面 MVVM 推荐顺序:
Create→ 把IZeusHost/IPointTable注入 ViewModel → 绑定界面 →StartAsync。构造 ViewModel 时可以读取点定义快照,尚未采集的点值为空。 - WinForms 的
AttachZeus(configure, ...)负责窗口生命周期和控件线程封送;WPF 的AttachZeus(configure, ...)只负责窗口生命周期,ViewModel 绑定源应显式传入WpfUiDispatcher.Current()。 - 需要登录后启动或托盘常驻时,使用
host.AttachManually(),再在业务就绪后调用attachment.StartAsync(),退出时释放attachment。
常见问题
- 启动后某可选/降级通道为
Faulted:默认会按退避自动重连;也可再次调用OpenAsync。必需通道启动失败会直接让StartAsync抛出异常。 - 进程退出后串口仍被占用:确认窗口关闭时调用了
DisposeAsync(使用AttachZeus时会自动处理)。