C#Topshelf TimeoutException

时间:2015-01-14 10:36:58

标签: c# .net windows-services topshelf

作为第一步,我创建了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();
}

有什么建议吗? Time Out Error

2 个答案:

答案 0 :(得分:12)

发生此错误的原因是您正在服务的Start方法中运行提取和处理方法。在Visual Studio中可以,但是当您安装服务并启动它时,服务控制管理器会等待Start方法返回,如果它在一定时间内没有这样做(默认为30秒),那么它将返回这个错误。

您有几个选项,所有这些选项都允许Start方法立即返回:

  1. 在单独的线程上调用提取和转换方法
  2. 异步调用提取和转换方法
  3. 使用计时器启动提取和转换过程

答案 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出错,提示无法启动该服务,但现在我终于知道原因了。