feat(*): 添加扫码枪启动探活、全局退出助手及 README

- 添加扫码枪串口启动探活,检测端口占用并更新 UI 状态
- 新增 ShutdownHelper 安全停止 Host 扩展方法
- 新增 README.md 项目说明文档
- 更新 WorkflowHostedService 启动探活逻辑
- 补充 ShutdownHelper 与 WorkflowHostedService 单元测试
- 优化 DashboardPage 与 SystemSettingsPage 界面布局
- 调整 ModbusTcpPlcService 监控镜像读取逻辑
This commit is contained in:
2026-04-19 14:29:07 +08:00
parent 8f74e07c66
commit d70b94e904
26 changed files with 1564 additions and 827 deletions

View File

@@ -0,0 +1,26 @@
using Microsoft.Extensions.Hosting;
namespace AxiOmron.PcbCheck.Utils;
/// <summary>
/// 提供应用退出阶段的异步宿主停止辅助能力,确保 await 后续逻辑保留在捕获到的同步上下文中。
/// </summary>
internal static class ShutdownHelper
{
/// <summary>
/// 停止指定 Host并在停止完成后于捕获的调用上下文中执行收尾回调。
/// </summary>
/// <param name="host">待停止的宿主实例。</param>
/// <param name="timeout">停止超时时间。</param>
/// <param name="afterStop">停止完成后的收尾回调。</param>
/// <returns>表示停止流程完成的任务。</returns>
/// <exception cref="ArgumentNullException">当 <paramref name="host"/> 为空时抛出。</exception>
internal static async Task StopHostAsync(IHost host, TimeSpan timeout, Action? afterStop = null)
{
ArgumentNullException.ThrowIfNull(host);
using var cancellationTokenSource = new CancellationTokenSource(timeout);
await host.StopAsync(cancellationTokenSource.Token);
afterStop?.Invoke();
}
}