作为第一步,我创建了Windows服务项目,并正确配置了
第二步我在项目中添加了TopShelf 版本3.1.135.0 如果我通过(F5运行)运行我的服务,那么它正在加载顶级控制台并且服务已完成成功。
然而,当我运行它来安装并从命令提示符启动它时,我的TimeOut错误低于。
Topshelf.Hosts.StartHost Error: 0 : The service failed to start., System.Service
Process.TimeoutException: Time out has expired and the operation has not been co
mpleted.
public class AppService
{
LoggingService loggingService = new LoggingService(typeof(AppService).Name);
public void Start()
{
loggingService.Info("SampleService is Started");
ExtractProcess.Start();
TransformProcess.Start();
}
public void Stop()
{
loggingService.Info("SampleService is Stopped");
}
}
- 更新了代码以解决此问题
public void Start()
{
loggingService.Info("MPS.GOA.ETLService is Started");
ThreadStart myThreadDelegate = new ThreadStart(StartService);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
}
private void StartService()
{
timer.Elapsed += new System.Timers.ElapsedEventHandler(OnElapsedTime);
timer.Interval = 60000 * ServiceIntervalInMinutes; //1 minute 60000 milliseconds
timer.Enabled = true;
Process();
}
private void Process()
{
ExtractProcess.Start();
TransformProcess.Start();
}
有什么建议吗?
答案 0 :(得分:12)
发生此错误的原因是您正在服务的Start方法中运行提取和处理方法。在Visual Studio中可以,但是当您安装服务并启动它时,服务控制管理器会等待Start方法返回,如果它在一定时间内没有这样做(默认为30秒),那么它将返回这个错误。
您有几个选项,所有这些选项都允许Start方法立即返回:
答案 1 :(得分:1)
如果您(像我一样)正在努力启动服务-到目前为止,您发现的所有内容都是在单独的线程中开始工作的引用(并且您已经这样做了) 是这里的解决方案 ..
我的问题是我有一个外部JSON配置文件正在从项目的目录路径中读取。我需要的是获取组装路径,以便在.NET应用程序与Topshelf一起发布和安装时-它会在正确的位置查找配置文件。
string assemblyPath = Path.GetDirectoryName(typeof(MyConfigManagerClass).Assembly.Location);
var builder = new ConfigurationBuilder()
.SetBasePath(assemblyPath)
.AddJsonFile("config.json", optional: false);
myConfigurationObject = builder.Build();
Topshelf出错,提示无法启动该服务,但现在我终于知道原因了。