首页 > 其他分享 >dotnet注册服务 secs4net secs

dotnet注册服务 secs4net secs

时间:2024-01-23 22:33:36浏览次数:31  
标签:stoppingToken hsmsConnection DeviceWorker secs secsGem dotnet using logger secs4

secs_learn/Program.cs

此文件是应用程序的入口点,用于配置和启动主机。

  • 使用 Host.CreateDefaultBuilder(args) 创建一个默认配置的主机构建器,自动加载环境变量、配置文件等设置。
  • .ConfigureServices(...) 方法中,通过 services.AddHostedService<DeviceWorker>() 注册 DeviceWorker 类型作为托管服务,这样在主机启动时会自动实例化并运行这个服务。
  • 最后,.Build().Run(); 构建并启动主机,执行注册的服务(在这里即为 DeviceWorker)。整个程序将持续运行,直到被显式停止或遇到不可恢复的错误。
using DeviceWorkerService;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        services.AddHostedService<DeviceWorker>();
    }).Build().Run();

secs_learn/DeviceWorker.cs

这个文件中定义了一个名为 DeviceWorker 的类,该类继承自 BackgroundService 类,这是 .NET Core 中用于创建长时间运行后台服务的基类。

  • ILogger<DeviceWorker>:注入日志记录器,用于在服务执行过程中输出日志信息。
  • ISecsConnection _hsmsConnection:注入一个实现了 ISecsConnection 接口的对象,它代表了与半导体设备之间的HSMS(High-Speed SECS Message Services)连接。
  • ISecsGem _secsGem:注入一个实现了 ISecsGem 接口的对象,用于提供与遵循GEM规范的设备进行交互的方法。

在构造函数中,设置了 _hsmsConnection.ConnectionChanged 事件处理器,以便当连接状态改变时记录日志信息。

ExecuteAsync 方法是 BackgroundService 的核心方法,在服务启动后会被调用并持续执行,直到收到取消信号或者发生异常。在此方法内:

  • 启动HSMS连接。
  • 使用异步循环等待接收来自设备的主消息(Primary Message)。
  • 对每一个接收到的主消息,构建对应的次消息(Secondary Message)并尝试回复给设备,如果在这个过程中出现异常,则记录错误日志。
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Secs4Net;
using System;
using System.Threading;
using System.Threading.Tasks;

namespace DeviceWorkerService;

internal sealed class DeviceWorker : BackgroundService
{
    private readonly ILogger<DeviceWorker> _logger;
    private readonly ISecsConnection _hsmsConnection;
    private readonly ISecsGem _secsGem;

    public DeviceWorker(ILogger<DeviceWorker> logger, ISecsConnection hsmsConnection, ISecsGem secsGem)
    {
        _logger = logger;
        _hsmsConnection = hsmsConnection;
        _secsGem = secsGem;

        _hsmsConnection.ConnectionChanged += delegate
         {
             switch (_hsmsConnection.State)
             {
                 case ConnectionState.Retry:
                     _logger.LogError($"Connection loss, try to reconnect.");
                     break;
                 case ConnectionState.Connecting:
                 case ConnectionState.Connected:
                     _logger.LogWarning(_hsmsConnection.State.ToString());
                     break;
                 default:
                     _logger.LogInformation($"Connection state = {_hsmsConnection.State}");
                     break;
             }
         };
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        try
        {
            _hsmsConnection.Start(stoppingToken);
            await foreach (var e in _secsGem.GetPrimaryMessageAsync(stoppingToken))
            {
                using var primaryMessage = e.PrimaryMessage;
                _logger.LogInformation($"Received primary message: {primaryMessage}");
                try
                {
                    using var secondaryMessage = new SecsMessage(primaryMessage.S, (byte)(primaryMessage.F + 1))
                    {
                        SecsItem = primaryMessage.SecsItem,
                    };
                    await e.TryReplyAsync(secondaryMessage, stoppingToken);
                }
                catch (Exception ex)
                {
                    _logger.LogError(ex, "Exception occurred when processing primary message");
                }
            }
        }
        catch (Exception ex)
        {
            if (stoppingToken.IsCancellationRequested)
            {
                return;
            }
            _logger.LogError(ex, "Unhandled exception occurred on primary messages processing");
        }
    }
}


标签:stoppingToken,hsmsConnection,DeviceWorker,secs,secsGem,dotnet,using,logger,secs4
From: https://www.cnblogs.com/zhuoss/p/17983589

相关文章

  • 将 .NET 8应用 以 dotnet publish 创建容器镜像并结合 Github Actions 部署到 Azure
    介绍.NET8无需DockerFile即可为.NET应用创建docker映像的新方法,我将使用dotnetpublish将.NET应用容器化,在本文中,我将分享我如何为.NET8的项目创建一个简单的ci/cd的经验。它包括2个主题:创建用于生成.NET应用并将其发布到Azure的GitHub工作流如何使用do......
  • dotnet 多数据库 sqlite efcore model和entity区别 一对多 多对一 多对多
    efcore-multi-db/MultiDb.slnMicrosoftVisualStudioSolutionFile,FormatVersion12.00#VisualStudio15VisualStudioVersion=15.0.27130.2024MinimumVisualStudioVersion=10.0.40219.1Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}")="......
  • dotnet efcore 多数据库 使用
    efcore的使用依赖包efcore-multi-db/MultiDb.Two/MultiDb.Two.csproj<ProjectSdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>net7.0</TargetFramework></PropertyGroup><ItemGroup><Packa......
  • dotnet 8项目Docker部署报错 Unhandled exception. Microsoft.Data.SqlClient.SqlExce
    环境:dotnet8+sqlserver2012本地开发调试正常,部署至Docker容器时,运行实例报错。查看日志显示:Unhandledexception.Microsoft.Data.SqlClient.SqlException(0x80131904):Aconnectionwassuccessfullyestablishedwiththeserver,butthenanerroroccurredduringth......
  • 半导体基础SECS协议 - GEM300
    GEM(GenericEquipmentModel)定义了Fab中各个场景下设备行为及其所使用SECS消息。GEM300的定义内容是GEM在300mm晶圆Fab的特化内容。本篇将简要介绍GEM300所涉协议、其中重要SEMI协议(E87、E40、E90、E39)、GEM300生产设备类型及其Load操作。 一、SignificanceofGEM3001.3......
  • dotnet 连接多个数据库
    SqliteToOracle\global.json{"sdk":{"version":"7.0.401"}}SqliteToOracle\SqliteToOracle.slnMicrosoftVisualStudioSolutionFile,FormatVersion12.00#VisualStudioVersion17VisualStudioVersion=17.0.3......
  • 从Netty到DotNetty
    Netty是什么Netty是一款用于创建高性能网络应用程序的高级框架。Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端DotNetty是什么DotNetty是微软的Azure团队仿造Netty编写的网络应用程序框架。优点关注点分离——业......
  • dotnet efcore sqlite entity
    dotnet使用efcore读写sqlite数据库要使用EFCore读写SQLite数据库,您需要安装以下NuGet包:Microsoft.EntityFrameworkCore.SqliteMicrosoft.EntityFrameworkCore.Tools以下是一个示例代码,它演示了如何使用EFCore读写SQLite数据库:usingSystem;usingMicrosoft.EntityFramew......
  • 纪念一下,在国产麒麟linux下跑dotnet8,运行起来了
    纪念一下,在国产麒麟linux下跑dotnet8,运行起来了1、用vs2022的dotnet8写的跨平台web项目,编译完成。2、在麒麟linux里安装dotnet: 参考微软官方的net8安装说明,  https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0  https://dotnet.microsoft.com/zh-cn/downl......
  • 【VSCode】CMake Language Support 总是下载 .NET 超时,但又不想升级dotnet
    错误信息Error:Couldnotresolvedotnetpath!Anerroroccurredwhileinstalling.NET(6.0):.NETAcquisitionFailed:Installationfailed:Error:.NETinstallationtimedout.Youmayneedtochangethetimeouttimeifyouhaveaslowconnection.Pleasesee:h......