【问题标题】:C# Topshelf TimeoutExceptionC# Topshelf 超时异常
【发布时间】:2015-03-12 12:24:19
【问题描述】:

作为第一步,我创建了 Windows 服务项目并对其进行了正确配置

在第二步中,我在项目中添加了TopShelf版本 3.1.135.0 如果我通过(F5 运行)运行我的服务,那么它正在加载顶级控制台并且服务已成功完成。

但是,当我运行它来安装并从命令提示符启动它时,我遇到了超时错误。

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();
}

有什么建议吗?

【问题讨论】:

  • AppService.Start() 是做什么的?
  • 我已经为它添加了代码。但问题是,如果我从 VS F5 服务运行正常,那么只有当我安装并运行它时才会出现超时错误
  • 提取过程从网络位置读取文件并加载到数据库中
  • 为什么在更新/固定的代码中需要一个计时器?

标签: c# .net windows-services topshelf


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,我按照你的建议修复了它。请看我的更新。我是否遵循最佳做法?
  • 对我来说看起来不错。您可以在没有 ThreadStart 的情况下执行此操作,但不会造成任何伤害。
【解决方案2】:

如果您(像我一样)正在努力启动服务 - 到目前为止,您所发现的只是对在单独线程中开始工作的引用(并且您已经这样做了)这可能在这里解决问题..

我的问题是我从项目的目录路径中读取了一个外部 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 报错说服务无法启动,现在终于知道原因了。

【讨论】:

  • 我在 .net 核心上遇到了这个问题。这个解决方案解决了我的问题。太好了。
【解决方案3】:

在我的情况下,上述解决方案都没有解决它,而是 topshelf 服务中的实际权限需要访问驻留在外部服务器中的文件。

测试服务器上运行的TopShelf程序

位于生产服务器上的日志文件

为了安全起见,测试服务器无权访问外部服务器 原因。

所以我更改了程序以在它自己的服务器内部引用所有内容,它运行良好。

【讨论】:

    猜你喜欢
    • 2015-11-29
    • 1970-01-01
    • 2018-11-22
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2017-07-02
    • 2020-03-16
    相关资源
    最近更新 更多