我已经用C#编写了一个Windows服务,基本上每分钟都会检查我的数据库以获取订单,从这些订单生成一个PDF,并通过电子邮件发送。
这个逻辑在我的testing中是完美的。
当我创build服务,并使用安装项目进行安装时,当我开始服务mmc服务时,我得到:
错误1053服务没有及时响应启动或控制请求
我的OnStart方法如下所示:
protected override void OnStart(string[] args) { //writeToWindowsEventLog("Service started", EventLogEntryType.Information); timer.Enabled = true; }
基本上,只是启用计时器…所以没有过程密集的电话那里。
我哪里错了?
我已经尝试设置启动帐户本地系统,networking服务等…没有任何工作!
编辑:
这里是我的代码:( processPurchaseOrders是数据库查询和pdf的生成等方法…)
public partial class PurchaseOrderDispatcher : ServiceBase { //this is the main timer of the service private System.Timers.Timer timer; public PurchaseOrderDispatcher() { InitializeComponent(); } // The main entry point for the process static void Main() { #if (!DEBUG) ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new PurchaseOrderDispatcher() }; ServiceBase.Run(ServicesToRun); #else //debug code PurchaseOrderDispatcher service = new PurchaseOrderDispatcher(); service.processPurchaseOrders(); #endif } private void InitializeComponent() { this.CanPauseAndContinue = true; this.ServiceName = "Crocus_PurchaseOrderGenerator"; } private void InitTimer() { timer = new System.Timers.Timer(); //wire up the timer event timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); //set timer interval var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]); timer.Interval = (timeInSeconds * 1000); // timer.Interval is in milliseconds, so times above by 1000 timer.Enabled = true; } protected override void Dispose(bool disposing) { if (disposing && (components != null)) components.Dispose(); base.Dispose(disposing); } protected override void OnStart(string[] args) { //instantiate timer Thread t = new Thread(new ThreadStart(this.InitTimer)); t.Start(); } protected override void OnStop() { //turn off the timer. timer.Enabled = false; } protected override void OnPause() { timer.Enabled = false; base.OnPause(); } protected override void OnContinue() { timer.Enabled = true; base.OnContinue(); } protected void timer_Elapsed(object sender, ElapsedEventArgs e) { processPurchaseOrders(); } }
来自MSDN :
“不要使用构造函数来执行应该在OnStart中的处理,使用OnStart来处理你的服务的所有初始化,构造函数在应用程序的可执行文件运行时被调用,而不是在服务运行的时候被调用,可执行文件在OnStart之前运行。 ,例如,构造函数不会再被调用,因为SCM已经把对象保存在内存中了,如果OnStop释放在构造函数中分配的资源而不是在OnStart中,那么在第二次调用服务时将不会再次创建所需的资源。
如果您的计时器没有在OnStart调用中初始化,这可能是一个问题。 我也会检查计时器的类型,确保它的服务的System.Timers.Timer。 以下是如何在Windows服务中设置计时器的示例。
// TODONT:只使用Windows服务来运行预定进程
我试过你的代码,似乎没问题。 我唯一的区别是硬编码计时器值(Service1.cs)。 让我知道如果下面不工作。
Service1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.Text; using System.Timers; using System.Threading; namespace WindowsServiceTest { public partial class Service1 : ServiceBase { private System.Timers.Timer timer; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { //instantiate timer Thread t = new Thread(new ThreadStart(this.InitTimer)); t.Start(); } protected override void OnStop() { timer.Enabled = false; } private void InitTimer() { timer = new System.Timers.Timer(); //wire up the timer event timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); //set timer interval //var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]); double timeInSeconds = 3.0; timer.Interval = (timeInSeconds * 1000); // timer.Interval is in milliseconds, so times above by 1000 timer.Enabled = true; } protected void timer_Elapsed(object sender, ElapsedEventArgs e) { int timer_fired = 0; } } }
Service1.Designer.cs
namespace WindowsServiceTest { partial class Service1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { components = new System.ComponentModel.Container(); this.ServiceName = "Service1"; this.CanPauseAndContinue = true; } #endregion } }
我只是创建了一个空白的Windows服务项目,并添加下面,所以我可以运行installutil.exe并附加到上面,看看事件是否触发(和它)。
using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.ServiceProcess; namespace WindowsServiceTest { [RunInstaller(true)] public class MyServiceInstaller : System.Configuration.Install.Installer { public MyServiceInstaller() { ServiceProcessInstaller process = new ServiceProcessInstaller(); process.Account = ServiceAccount.LocalSystem; ServiceInstaller serviceAdmin = new ServiceInstaller(); serviceAdmin.StartType = ServiceStartMode.Manual; serviceAdmin.ServiceName = "Service1"; serviceAdmin.DisplayName = "Service1 Display Name"; Installers.Add(process); Installers.Add(serviceAdmin); } } }
我只是有同样的问题。
事实证明,这是因为我在调试模式下将它作为控制台运行 – 就像上面的代码一样
#if (!DEBUG) #else //debug code #endif
我已经在调试模式下编译并安装了该服务
当我编译它在释放模式下,它按预期工作
希望这可以帮助
如果其他人将来会遇到这种情况,那么在Windows server 2012上尝试启动Windows服务时,我会收到相同的错误1053。
这个问题最终导致该服务是针对.NET Framework 4.5.1开发的,但是Windows server 2012实例没有安装该.NET Framework的版本。 将服务备份到目标.NET 4.0修复了错误。
我去服务器控制台(在服务器机房),并从那里启动服务。 远程不会工作。
也有这个错误,直到我发现我的.config文件上有一个多余的“>”字符。
所以,请在打出计算机之前再次检查您的.config文件;)
这对我有效。 基本上确保登录用户设置为正确的。 但是,这取决于如何设置帐户基础结构。 在我的例子中,它使用AD帐户用户凭据。
在启动菜单搜索框搜索“服务” – 在服务中找到所需的服务 – 右键点击并选择登录选项卡 – 选择“此帐户”,并输入所需的内容/凭据 – 像往常一样启动服务
构造函数是我的问题。 构造函数必须抛出一个关于缺少DLL的注意事项。
我的问题:我创建安装程序的经验不足。 我没有将依赖的DLL复制到安装文件夹中(我需要在创建主项目输出时选择发布构建配置)。
在我的情况下, 我试图安装.net 3.5服务到Windows 2012服务器。 在服务器中安装了.NET 4.0框架。
我将我的目标服务框架更改为.Net 4.0。 现在它工作正常。
从包含该服务的程序集中执行的第一件事是Main方法。 它必须采取特殊的行动,或者至少有一个这样的行动:
public static int Main() { Run(new System.ServiceProcess.ServiceBase[] { new YourServiceClass() }); }
这是我在创建我的第一个服务之后,在尝试和错误会议后发现的。 我没有使用VS. 我确实使用了VS指南( 演练:在组件设计器中创建一个Windows服务应用程序 ),而我更愿意使用这个指南: 逐步创建一个C#服务:第一课 。
没有合适的“Main”方法,可执行文件立即完成,系统报告超过30秒超时:)
像我这样的。 在4.6.1不工作(我有相同的消息)。 然后我尝试在4.5,工作正常。