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# 网络连接中异常断线的处理:ReceiveTimeout, SendTimeout 及 KeepAliveValues(设置心跳)