我已经编写了一个简单的代码,应该使用topshelf自动开始。问题是,如果我从Visual Studio中运行它,或者只是单击exe文件上的debug文件夹,它就会启动,没有任何问题。
这是我的代码
using System; using System.Collections.Generic; using Topshelf; using System.IO; namespace ConsoleCRP { public class Program { public static void Main(){ var rc = HostFactory.Run(x =>{ x.Service<ClientReportingScheduler>(s => { s.ConstructUsing(name => new ClientReportingScheduler()); s.WhenStarted(tc => tc.Start()); s.WhenStopped(tc => tc.Stop()); }); x.StartAutomatically(); x.RunAsLocalSystem(); x.SetDescription("This is automatic scheduler"); x.SetDisplayName("scheduler"); x.SetServiceName("servicetest"); }); var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode()); Environment.ExitCode = exitCode; } } public class ClientReportingScheduler { public System.Timers.Timer _timer; public int startJob = 0; public ClientReportingScheduler() { startJob = 1000 * 5 ; _timer = new System.Timers.Timer(startJob) { AutoReset = true }; _timer.Elapsed += (sender, eventArgs) => { Console.WriteLine("Starting scheduler query check at {0}" + Environment.NewLine, DateTime.Now); }; } public void Start() { _timer.Start(); } public void Stop() { _timer.Stop(); } } }
我确实从topshelf文档中复制了示例,对该代码仅做了一些小的更改。我只在此处粘贴了此版本的简短版本(只是为了向您展示问题)。在完整版中,我也使用fluentscheduler,并且有很多代码可以连接到postgress,获取一些数据并执行一些存储过程,但这不是问题。问题在于,即使您在上面看到的这个小代码也根本无法使用。如果您启动新的控制台应用程序并将其粘贴到其中(现在可以从nuget添加topshelf),则可以立即创建此程序。如果启动它,它应该可以工作,但是如果将其作为服务安装,则根本不起作用...
以下是我作为服务安装时执行的步骤:1)以管理员身份打开CMD2)进入目录进行调试3)以这种方式安装:ConsoleCRP.exe安装4)启动服务:net start servicetest5)如果要停止服务:net stop servicetest6)如果要卸载:ConsoleCRP.exe卸载
以下是结果:配置结果:[成功]名称服务测试[成功] DisplayName调度程序[成功]说明这是自动调度程序[成功] ServiceName servicetestTopshelf v4.2.1.215,.NET Framework v4.0.30319.42000servicetest服务现在正在运行,请按Control + C退出。在08/10/2019 16:31:12启动调度程序查询检查]
在08/10/2019 16:31:17启动调度程序查询检查
在08/10/2019 16:31:22启动调度程序查询检查
在08/10/2019 16:31:27启动调度程序查询检查
所以,请告诉我,该代码有什么问题,因为它不能作为服务使用???在此先感谢您的帮助!
我已经编写了一个简单的代码,应该使用topshelf自动开始。问题是,如果我从Visual Studio中运行它,或者只是单击调试文件夹上的...
我发现了问题...有两个问题。首先,当这是服务时,它将完全不会打开控制台应用程序,如果您想查看任何内容,则必须将其编写,即写入txt文件...
第二(在我的整个项目中)是我使用自己的记录器编写所有内容,该记录器使用AppDomain.CurrentDomain.BaseDirectory编写文件...看来这是不允许的,因为这是很繁琐的,您必须编写登录其他地方。