C# Topshelf 超时异常

Posted

技术标签:

【中文标题】C# Topshelf 超时异常【英文标题】:C# Topshelf TimeoutException 【发布时间】: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 服务运行正常,那么只有当我安装并运行它时才会出现超时错误 提取过程从网络位置读取文件并加载到数据库中 为什么在更新/固定的代码中需要一个计时器? 【参考方案1】:

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

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

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

【讨论】:

谢谢,我按照你的建议修复了它。请看我的更新。我是否遵循最佳做法? 对我来说看起来不错。您可以在没有 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程序

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

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

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

【讨论】:

以上是关于C# Topshelf 超时异常的主要内容,如果未能解决你的问题,请参考以下文章

如何处理C#的HttpWebResponse的GetResponse中的超时异常

C# 关於数据库连接关闭的异常

C# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)

如何在对引发异常的 C# webmethod 的 ajax 调用上指定消息?

从 C# 应用程序安装 TopShelf 服务

C# 屏障超时