IStation.SZJT.sln
@@ -11,6 +11,10 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IStation.Entry.SZJT", "IStation.Entry.SZJT\IStation.Entry.SZJT.csproj", "{F1588C3D-A562-49FA-BC8C-2BF621CAFB57}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IStation.Server.SZJT", "IStation.Server.SZJT\IStation.Server.SZJT.csproj", "{14EA9BD9-E247-4137-BF81-5FE44C1CBC86}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IStation.TopShelf.SZJT", "IStation.TopShelf.SZJT\IStation.TopShelf.SZJT.csproj", "{D51AD228-0E78-471E-9003-58469F800DE5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -33,6 +37,14 @@ {F1588C3D-A562-49FA-BC8C-2BF621CAFB57}.Debug|Any CPU.Build.0 = Debug|Any CPU {F1588C3D-A562-49FA-BC8C-2BF621CAFB57}.Release|Any CPU.ActiveCfg = Release|Any CPU {F1588C3D-A562-49FA-BC8C-2BF621CAFB57}.Release|Any CPU.Build.0 = Release|Any CPU {14EA9BD9-E247-4137-BF81-5FE44C1CBC86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {14EA9BD9-E247-4137-BF81-5FE44C1CBC86}.Debug|Any CPU.Build.0 = Debug|Any CPU {14EA9BD9-E247-4137-BF81-5FE44C1CBC86}.Release|Any CPU.ActiveCfg = Release|Any CPU {14EA9BD9-E247-4137-BF81-5FE44C1CBC86}.Release|Any CPU.Build.0 = Release|Any CPU {D51AD228-0E78-471E-9003-58469F800DE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D51AD228-0E78-471E-9003-58469F800DE5}.Debug|Any CPU.Build.0 = Debug|Any CPU {D51AD228-0E78-471E-9003-58469F800DE5}.Release|Any CPU.ActiveCfg = Release|Any CPU {D51AD228-0E78-471E-9003-58469F800DE5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE IStation.Server.SZJT/0-helper/ConfigHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ namespace IStation.Server { /// <summary> /// /// </summary> internal class ConfigHelper { /// <summary> /// éç½®é¢ç /// </summary> public static int ResetFrequency { get { return Settings.SZJTParasHelper.SZJT.Task.Frequency; } } } } IStation.Server.SZJT/0-helper/IJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ namespace IStation.Server { /// <summary> /// ä»»å¡è¾ å©ç±»æ¥å£ /// </summary> public interface IJobHelper { /// <summary> /// å¼å§ä»»å¡ /// </summary> Task StartJob(); /// <summary> /// åæ¶ä»»å¡ /// </summary> Task CancelJob(); } } IStation.Server.SZJT/0-helper/JobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ namespace IStation.Server { /// <summary> /// /// </summary> public class JobHelper { private List<IJobHelper> _jobHelpers = new List<IJobHelper>() { new EquipmentRunAnalyServiceJobHelper() }; /// <summary> /// /// </summary> public void StartJob() { _jobHelpers.ForEach(async x => await x.StartJob()); } /// <summary> /// /// </summary> public void CancelJob() { _jobHelpers.ForEach(async x => await x.CancelJob()); } } } IStation.Server.SZJT/1-equipment-run-analy/1-service/EquipmentRunAnalyServiceJob.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,100 @@ namespace IStation.Server { /// <summary> /// 设å¤è¿è¡åææå¡ä»»å¡ /// </summary> [DisallowConcurrentExecution] public class EquipmentRunAnalyServiceJob : IJob { private static readonly List<EquipmentRunAnalySingleJobHelper> _jobHelpers = new List<EquipmentRunAnalySingleJobHelper>(); /// <summary> /// /// </summary> public Task Execute(IJobExecutionContext context) { return Task.Run(async () => { try { #region å è½½é ç½® var configureList = new Yw.Service.RunAnalyConfigure().GetAll(); configureList = configureList?.Where(x => x.ObjectType == Yw.Assets.DataType.Equipment).ToList(); if (configureList == null || configureList.Count < 1) { LogHelper.Error("设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼æªæ£ç´¢å°é 置信æ¯"); CancelJobs(); return; } #endregion #region å¼å¯ä»»å¡ foreach (var configure in configureList) { var jobHelper = _jobHelpers.Find(x => x.Configure.ObjectType == configure.ObjectType && x.Configure.ObjectID == configure.ObjectID && x.Configure.ChangeTimes == configure.ChangeTimes && x.Configure.Frequency == configure.Frequency); if (jobHelper == null) { jobHelper = new EquipmentRunAnalySingleJobHelper(); await jobHelper.StartJob(configure); _jobHelpers.Add(jobHelper); LogHelper.Info($"设å¤è¿è¡åææå¡ä»»å¡ä¸,æ°æ®id:{configure.ObjectID},æ¹å次æ°:{configure.ChangeTimes},åæé¢ç:{configure.Frequency},计åä»»å¡å¼å¯ï¼"); } } #endregion #region å ³éä»»å¡ foreach (var jobHelper in _jobHelpers.ToList()) { var configure = configureList.Find(x => x.ObjectType == jobHelper.Configure.ObjectType && x.ObjectID == jobHelper.Configure.ObjectID && x.ChangeTimes == jobHelper.Configure.ChangeTimes && x.Frequency == jobHelper.Configure.Frequency); if (configure == null) { await jobHelper.CancelJob(); _jobHelpers.Remove(jobHelper); LogHelper.Info($"设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼,æ°æ®id:{jobHelper.Configure.ObjectID},æ¹å次æ°:{jobHelper.Configure.ChangeTimes},åæé¢ç:{jobHelper.Configure.Frequency},计åä»»å¡å ³éï¼"); } } #endregion LogHelper.Info($"设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼å¼å¯ä»»å¡æ°é为{_jobHelpers.Count}ï¼"); } catch (Exception ex) { LogHelper.Error("设å¤è¿è¡åææå¡ä»»å¡ä¸ï¼æ§è¡åºéï¼", ex); var e = new JobExecutionException(ex); throw e; } }); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public static void CancelJobs() { if (_jobHelpers != null && _jobHelpers.Count > 0) { _jobHelpers.ForEach(async x => await x.CancelJob()); _jobHelpers.Clear(); } } } } IStation.Server.SZJT/1-equipment-run-analy/1-service/EquipmentRunAnalyServiceJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,65 @@ namespace IStation.Server { /// <summary> /// 设å¤è¿è¡æå¡ä»»å¡è¾ å©ç±» /// </summary> public class EquipmentRunAnalyServiceJobHelper : IJobHelper { private const string _jobName = "EquipmentRunAnalyServiceJobName"; private const string _jobGroup = "EquipmentRunAnalyServiceJobGroup"; private const string _triggerName = "EquipmentRunAnalyServiceJobTrigger"; private static IScheduler _sched;//è°åº¦å¨ /// <summary> /// å¼å§ä»»å¡ /// </summary> public async Task StartJob() { if (_sched != null) return; // 1.å建schedulerçå¼ç¨ var fac = new Quartz.Impl.StdSchedulerFactory(); _sched = await fac.GetScheduler(); //2.å¯å¨ scheduler await _sched.Start(); //3.åå»ºä»»å¡ var job = JobBuilder.Create<EquipmentRunAnalyServiceJob>() .WithIdentity(_jobName, _jobGroup) .Build(); //4.å建Trigger var trigger = TriggerBuilder.Create() .WithIdentity(_triggerName, _jobGroup) .WithSimpleSchedule(x => x.WithIntervalInMinutes(ConfigHelper.ResetFrequency) .RepeatForever() .WithMisfireHandlingInstructionNextWithRemainingCount()) .Build(); //5.å å ¥è°åº¦ç®¡çå¨ await _sched.ScheduleJob(job, trigger); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public async Task CancelJob() { if (_sched == null) return; var triggerKey = new TriggerKey(_triggerName, _jobGroup); if (await _sched.CheckExists(triggerKey)) { await _sched.UnscheduleJob(triggerKey); } EquipmentRunAnalyServiceJob.CancelJobs(); } } } IStation.Server.SZJT/1-equipment-run-analy/2-single/EquipmentRunAnalyChangeTimesHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,53 @@ namespace IStation.Server { /// <summary> /// /// </summary> public class EquipmentRunAnalyChangeTimesHelper { private static Dictionary<long, List<Yw.Model.MonitorRealRecord>> _dict = new Dictionary<long, List<Yw.Model.MonitorRealRecord>>();//ç¼å /// <summary> /// 设置 /// </summary> public static void Set(long configureId, int changeTimes, Yw.Model.MonitorRealRecord record) { if (!_dict.ContainsKey(configureId)) { _dict.Add(configureId, new List<Yw.Model.MonitorRealRecord>()); } if (_dict[configureId].Count >= changeTimes) { _dict[configureId].RemoveAt(0); } if (record != null) { _dict[configureId].Add(record); } } /// <summary> /// æ¯å¦æ¹å /// </summary> public static bool HasChanged(long configureId, int changeTimes) { if (!_dict.ContainsKey(configureId)) { return false; } if (_dict[configureId].Count < changeTimes) { return false; } if (_dict[configureId].Select(x => x.DataValue).Distinct().Count() > 1) { return false; } return true; } } } IStation.Server.SZJT/1-equipment-run-analy/2-single/EquipmentRunAnalySingleJob.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,210 @@ namespace IStation.Server { /// <summary> /// 设å¤è¿è¡åæåä»»å¡ /// </summary> [DisallowConcurrentExecution]//æ¤ç¹æ§æ è¯ å¿ é¡»çå¾ è¿æ¬¡ä»»å¡æ§è¡å®æåï¼æè½æ§è¡ä¸æ¬¡ä»»å¡ public class EquipmentRunAnalySingleJob : IJob { internal const string Instance = "Instance"; private Yw.Model.RunAnalyConfigure _configure; /// <summary> /// /// </summary> public Task Execute(IJobExecutionContext context) { return Task.Run(() => { try { #region 任塿°æ® var dataMap = context.MergedJobDataMap; var jobModel = (Yw.Model.RunAnalyConfigure)dataMap[Instance]; if (jobModel == null) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼ä»»å¡æ°æ®ä¼ è¾å¤±è´¥ï¼"); return; } var configure = jobModel; _configure = configure; #endregion #region è·åè®¾å¤ var allEquipmentList = new Yw.Service.Equipment().GetChildAndSelfByID(configure.ObjectID); if (allEquipmentList == null || allEquipmentList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢è®¾å¤å¤±è´¥ï¼"); return; } var allEquipmentIds = allEquipmentList.Select(x => x.ID).Distinct().ToList(); #endregion #region è·åæµç¹ var allMonitorMappingList = new Yw.Service.EquipmentMonitorMapping().GetByEquipmentIds(allEquipmentIds); if (allMonitorMappingList == null || allMonitorMappingList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢æµç¹å ³è失败ï¼"); return; } var allMonitorIds = allMonitorMappingList.Select(x => x.MonitorPointID).Distinct().ToList(); var allMonitorList = new Yw.Service.MonitorPoint().GetExSignalWithSignalTypeByIds(allMonitorIds); allMonitorList = allMonitorList?.Where(x => x.UseStatus == Yw.Model.eUseStatus.Enable).ToList(); if (allMonitorList == null || allMonitorList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢æµç¹å¤±è´¥ï¼"); return; } #endregion #region è¿è¡æµç¹ var monitorList = allMonitorList.Where(x => x.SignalList.Exists(t => t.SignalType.Code == Yw.Monitor.SignalType.è¿è¡ç¶æ)).ToList(); if (monitorList == null || monitorList.Count < 1) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} æ£ç´¢è¿è¡ç¶ææµç¹å¤±è´¥ï¼"); return; } var monitor = monitorList.Find(x => x.Flags.Contains(IStation.Flags.é»è®¤)); if (monitor == null) { monitor = monitorList.First(); } #endregion #region è¿ç»ç¼å var lastRecord = new Yw.Service.MonitorRealRecord().GetLastRecord(monitor.SignalList.First().ID); EquipmentRunAnalyChangeTimesHelper.Set(configure.ID, configure.ChangeTimes, lastRecord); #endregion #region æ°æ®åæ var run_record = new Yw.Model.RunRealRecord() { ObjectType = configure.ObjectType, ObjectID = configure.ObjectID, DataTime = DateTime.Now, RSa = Yw.Run.RunStatus.Stop, ContinueRunTime = 0, TotalRunTime = 0, BootTimes = 0, AnalyStatus = Yw.Run.AnalyStatus.Normal, AnalyInfo = null }; var lastRunRecord = new Yw.Service.RunRealRecord().GetLastRecord(configure.ObjectType, configure.ObjectID); if (lastRunRecord == null) { run_record.AnalyInfo = "馿¬¡åæ"; if (lastRecord == null) { run_record.AnalyStatus = Yw.Run.AnalyStatus.Missing; } else { if (double.TryParse(lastRecord.DataValue, out double outDataValue)) { if (outDataValue > 0) { run_record.RSa = Yw.Run.RunStatus.Run; run_record.ContinueRunTime += configure.Frequency; run_record.TotalRunTime += configure.Frequency; run_record.BootTimes += 1; } } else { run_record.AnalyStatus = Yw.Run.AnalyStatus.Abnormal; } } } else { run_record.RSa = lastRunRecord.RSa; run_record.ContinueRunTime = lastRunRecord.ContinueRunTime; run_record.TotalRunTime = lastRunRecord.TotalRunTime; run_record.BootTimes = lastRunRecord.BootTimes; if (lastRecord == null) { run_record.AnalyStatus = Yw.Run.AnalyStatus.Missing; } else { if (double.TryParse(lastRecord.DataValue, out double outDataValue)) { var run_status = outDataValue > 0 ? Yw.Run.RunStatus.Run : Yw.Run.RunStatus.Stop; if (run_status != run_record.RSa) { if (EquipmentRunAnalyChangeTimesHelper.HasChanged(configure.ID, configure.ChangeTimes)) { run_record.RSa = run_status; if (run_status == Yw.Run.RunStatus.Run) { run_record.BootTimes += 1; } if (run_record.RSa == Yw.Run.RunStatus.Stop) { run_record.ContinueRunTime = 0; } } } } else { run_record.AnalyStatus = Yw.Run.AnalyStatus.Abnormal; } } if (run_record.RSa == Yw.Run.RunStatus.Run) { run_record.TotalRunTime += configure.Frequency; run_record.ContinueRunTime += configure.Frequency; } } #endregion #region æ°æ®åå¨ var bol = new Yw.Service.RunRealRecord().InsertLastRecord(run_record); if (bol) { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} è¿è¡è®°å½åææåï¼"); } else { LogHelper.Info($"设å¤è¿è¡åæåä»»å¡ä¸ï¼è®¾å¤id:{configure.ObjectID} è¿è¡è®°å½ä¿å失败ï¼"); } #endregion } catch (Exception ex) { LogHelper.Error($"设å¤è¿è¡åæåä»»å¡ä¸ï¼ æ°æ®id:{_configure.ObjectID}, æ§è¡åºé", ex); var e = new JobExecutionException(ex); throw e; } }); } } } IStation.Server.SZJT/1-equipment-run-analy/2-single/EquipmentRunAnalySingleJobHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,73 @@ namespace IStation.Server { /// <summary> /// 设å¤è¿è¡åæåä»»å¡è¾ å©ç±» /// </summary> public class EquipmentRunAnalySingleJobHelper { private IScheduler _sched;//è°åº¦å¨ /// <summary> /// é ç½® /// </summary> public Yw.Model.RunAnalyConfigure Configure { get; set; } /// <summary> /// å¼å§ä»»å¡ /// </summary> public async Task StartJob(Yw.Model.RunAnalyConfigure configure) { if (_sched != null) { return; } this.Configure = configure; var jobName = EquipmentRunAnalySingleJobNameHelper.GetJobName(configure); var jobGroupName = EquipmentRunAnalySingleJobNameHelper.GetJobGroupName(configure); var triggerName = EquipmentRunAnalySingleJobNameHelper.GetTriggerName(configure); // 1.å建schedulerçå¼ç¨ var fac = new Quartz.Impl.StdSchedulerFactory(); _sched = await fac.GetScheduler(); //2.å¯å¨ scheduler await _sched.Start(); //3.åå»ºä»»å¡ var job = JobBuilder.Create<EquipmentRunAnalySingleJob>() .WithIdentity(jobName, jobGroupName) .Build(); job.JobDataMap.Put(EquipmentRunAnalySingleJob.Instance, configure); //4.å建Trigger var trigger = TriggerBuilder.Create() .WithIdentity(triggerName, jobGroupName) .WithSimpleSchedule(x => x.WithIntervalInSeconds(configure.Frequency) .RepeatForever().WithMisfireHandlingInstructionNextWithRemainingCount()) .Build(); //5.å å ¥è°åº¦ç®¡çå¨ await _sched.ScheduleJob(job, trigger); } /// <summary> /// åæ¶ä»»å¡ /// </summary> public async Task CancelJob() { if (_sched == null) return; var jobGroupName = EquipmentRunAnalySingleJobNameHelper.GetJobGroupName(this.Configure); var triggerName = EquipmentRunAnalySingleJobNameHelper.GetTriggerName(this.Configure); var triggerKey = new TriggerKey(triggerName, jobGroupName); if (await _sched.CheckExists(triggerKey)) { await _sched.UnscheduleJob(triggerKey); } } } } IStation.Server.SZJT/1-equipment-run-analy/2-single/EquipmentRunAnalySingleJobNameHelper.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ namespace IStation.Server { /// <summary> /// 设å¤è¿è¡åä»»å¡åç§°è¾ å©ç±» /// </summary> public class EquipmentRunAnalySingleJobNameHelper { private const string _jobNameHeader = "EquipmentRunAnalySingleJobName"; private const string _jobGroupHeader = "EquipmentRunAnalySingleJobGroup"; private const string _triggerNameHeader = "EquipmentRunAnalySingleJobTrigger"; /// <summary> /// è·åä»»å¡åç§° /// </summary> public static string GetJobName(Yw.Model.RunAnalyConfigure rhs) { return $"{_jobNameHeader}_{rhs.ID}"; } /// <summary> /// è·åä»»å¡ç»åç§° /// </summary> public static string GetJobGroupName(Yw.Model.RunAnalyConfigure rhs) { return $"{_jobGroupHeader}_{rhs.ID}"; } /// <summary> /// è·å触åå¨åç§° /// </summary> public static string GetTriggerName(Yw.Model.RunAnalyConfigure rhs) { return $"{_triggerNameHeader}_{rhs.ID}"; } } } IStation.Server.SZJT/GlobalUsings.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ global using System.Text; global using System.ComponentModel; global using System.Security.Cryptography; global using System.Reflection; global using System.Data; global using System.Globalization; global using System.Collections; global using Quartz; global using Yw; IStation.Server.SZJT/IStation.Server.SZJT.csproj
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>disable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Yw.Log4Net.Core" Version="1.0.0" /> <PackageReference Include="Yw.Quartz.Core" Version="1.0.0" /> <PackageReference Include="Yw.Service.Assets.Core" Version="1.1.4" /> <PackageReference Include="Yw.Service.Monitor.Core" Version="1.3.6" /> <PackageReference Include="Yw.Service.Run.Core" Version="1.0.1" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\IStation.Service.SZJT\IStation.Service.SZJT.csproj" /> </ItemGroup> </Project> IStation.Server.SZJT/Program.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ // See https://aka.ms/new-console-template for more information using IStation.Server; LogHelper.Info("å¼å§å¯å¨èå·éåºæå¡..."); var jobHelper = new JobHelper(); jobHelper.StartJob(); AppDomain.CurrentDomain.ProcessExit += (sender, e) => { jobHelper.CancelJob(); }; LogHelper.Info("èå·éåºæå¡å¯å¨æåï¼"); Console.ReadLine(); IStation.TopShelf.SZJT/IStation.TopShelf.SZJT.csproj
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net6.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="Yw.TopShelf" Version="1.0.0" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\IStation.Server.SZJT\IStation.Server.SZJT.csproj" /> </ItemGroup> </Project> IStation.TopShelf.SZJT/Program.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ // See https://aka.ms/new-console-template for more information using IStation.TopShelf; using Topshelf; HostFactory.Run(x => { x.Service<Service>(); x.RunAsLocalSystem(); x.SetDescription("æºæ §æ³µç«Coreçæå¡ç¨åº(SZJT)"); x.SetDisplayName("IStation.Core.Server.SZJT"); x.SetServiceName("IStation.Core.Server.SZJT"); x.EnableServiceRecovery(r => r.RestartService(TimeSpan.FromSeconds(120))); x.StartAutomatically(); }); IStation.TopShelf.SZJT/Properties/PublishProfiles/FolderProfile.pubxml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ <?xml version="1.0" encoding="utf-8"?> <!-- https://go.microsoft.com/fwlink/?LinkID=208121. --> <Project> <PropertyGroup> <Configuration>Release</Configuration> <Platform>Any CPU</Platform> <PublishDir>bin\Release\net6.0\publish\</PublishDir> <PublishProtocol>FileSystem</PublishProtocol> </PropertyGroup> </Project> IStation.TopShelf.SZJT/Properties/PublishProfiles/FolderProfile.pubxml.user
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <!-- https://go.microsoft.com/fwlink/?LinkID=208121. --> <Project> <PropertyGroup> <History>True|2023-11-29T07:11:51.9151157Z;True|2023-11-29T14:58:05.0127775+08:00;</History> </PropertyGroup> </Project> IStation.TopShelf.SZJT/Service.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ using Topshelf; using IStation.Server; namespace IStation.TopShelf { /// <summary> /// /// </summary> public class Service : ServiceControl { private readonly JobHelper _jobHelper = new(); /// <summary> /// /// </summary> /// <param name="hostControl"></param> /// <returns></returns> public bool Start(HostControl hostControl) { _jobHelper.StartJob(); return true; } /// <summary> /// /// </summary> /// <param name="hostControl"></param> /// <returns></returns> public bool Stop(HostControl hostControl) { _jobHelper.CancelJob(); return true; } } }