跳到主要内容

宿主生命周期

宿主负责打开通道、运行后台服务,并在退出时按相反顺序释放资源。

顺序​

  1. ZeusHost.Create:登记通道、设备和点定义,此时还不打开端口。点快照可查询,但 Value / UpdatedAt 为空。
  2. StartAsync / ConnectAsync:按注册顺序打开通道并开始采集。required 通道打开失败会终止启动并回滚已打开通道;optional / degraded 通道打开失败会记入日志,宿主继续启动并交给自动重连恢复。
  3. 运行期间通过 Channels、Devices、Points 访问对象;采集循环按间隔轮询。
  4. 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 时会自动处理)。