#c# #service #topshelf
Вопрос:
Я очень новичок в разработке на C# и никогда раньше не использовал TopShelf для создания сервиса. Я думаю, что у меня правильно настроена верхняя полка для запуска таймера приложения, но когда я скомпилирую приложение и перейду к его установке, служба не запустится, выдав ошибку 1053. Служба, похоже, запускается только как учетная запись локальной системы с взаимодействием с рабочим столом. Я не могу не думать, что я сделал что-то не так при настройке TopShelf для запуска, так как процесс запуска запустит таймер. Я думаю, что из-за моего незнания C# я не сообщил менеджеру службы, что мое приложение запущено. С точки зрения моего опыта в C#, я даже не знаю достаточно, чтобы быть опасным, использую VB в течение многих лет, и мне пришлось выучить C# сейчас, чтобы продолжать работать.
using HPLC_Transport; using System; using Topshelf; namespace HPLC_Transport_Ser { internal class Program { [Obsolete] private static void Main(string[] args) { try { var exitCode = HostFactory.Run(x =gt; { Topshelf.HostConfigurators.HostConfigurator hostConfigurator = x.Servicelt;HPLC_Transport_Service.Maingt;(s =gt; { s.ConstructUsing(name =gt; new HPLC_Transport_Service.Main()); s.WhenStarted(HPLC_Transport =gt; HPLC_Transport.Start()); s.WhenStopped(HPLC_Transport =gt; HPLC_Transport.Stop()); }); x.StartAutomatically(); x.SetServiceName("HPLCTransportService"); x.SetDisplayName("HPLC Transport Service"); x.SetDescription("The application evaluates the data save folder from the OpenLab software for new reports. " "Evaluate the report data and determine if that data exists in the database for HPLC test data. " "If the data does not exist then writes it to the database"); }); // Snag the exit code value to return for the reason why the service stops int exitCodeValue = (int)Convert.ChangeType(exitCode, exitCode.GetTypeCode()); Environment.ExitCode = exitCodeValue; } catch (Exception ex) { ErrorLogger.WriteToErrorLog("Errors", ex.Message, ex.StackTrace); } } } } public void Start() { //DoAutoClick(); // Setups Timer and starts it to fire all other events int processTime = System.Convert.ToInt32(ConfigurationManager.AppSettings["ProcessTimer"]); CycleTimr = new System.Timers.Timer((1000 * 60) * processTime) { AutoReset = true }; CycleTimr.Elapsed = CycleTimr_Elapsed; CycleTimr.Start(); } public void Stop() { CycleTimr.Stop(); // We might want clean up when it stops }