我在C#中编写了一个Windows服务,基本上每分钟都会检查我的数据库中的订单,从这些订单生成PDF并通过电子邮件发送。
逻辑在我的测试等中完美运行。
当我创建服务并使用安装项目安装它时,当我在服务mmc中启动服务时,我得到:
错误1053服务没有及时响应启动或控制请求
我的OnStart方法如下所示:
protected override void OnStart(string[] args)
{
//writeToWindowsEventLog("Service started", EventLogEntryType.Information);
timer.Enabled = true;
}
基本上,只需启用计时器......所以没有进程密集的呼叫。
我哪里错了?
我已经尝试将启动帐户设置为本地系统,网络服务等......没有任何作用!
编辑:
这是我的代码:( 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();
}
}
答案 0 :(得分:28)
我遇到了同样的问题。
原来是因为我在调试模式下将其作为控制台运行 - 就像上面的代码一样
#if (!DEBUG)
#else //debug code
#endif
我已经在调试模式下编译并安装了服务
当我在发布模式下编译它时,它按预期工作
希望这有帮助
答案 1 :(得分:27)
来自MSDN:
“不要使用构造函数来执行应该在OnStart中的处理。使用OnStart来处理服务的所有初始化。构造函数在应用程序的可执行文件运行时调用,而不是在服务运行时调用。可执行文件在OnStart之前运行。当你继续例如,由于SCM已经将对象保存在内存中,因此不会再次调用构造函数。如果OnStop释放在构造函数而不是OnStart中分配的资源,则第二次调用服务时将不会再次创建所需的资源。
如果您的计时器未在OnStart调用中初始化,则可能是一个问题。
我还会检查计时器的类型,确保它是一个System.Timers.Timer for Services。 Here是如何在Windows服务中设置计时器的示例。
//TODONT: Use a Windows Service just to run a scheduled process
我尝试了你的代码,似乎没问题。我唯一的区别是硬编码定时器值(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);
}
}
}
答案 2 :(得分:11)
如果将来遇到其他人,我在Windows Server 2012上尝试启动Windows服务时收到了相同的错误1053.
问题最终是该服务是针对.NET framework 4.5.1开发的,但Windows Server 2012实例没有安装该版本的.NET框架。将服务备份到目标.NET 4.0修复了错误。
答案 3 :(得分:2)
构造函数对我来说是个问题。构造函数必须抛出关于缺失DLL的重复。
我的问题:我缺乏创建安装程序的经验。我没有将依赖的DLL复制到安装文件夹中(我需要在创建主项目输出时选择发布构建配置)。
答案 4 :(得分:2)
这对我有用。基本上确保登录用户设置为正确的用户。但是,这取决于帐户基础结构的设置方式。在我的示例中,它使用的是AD帐户用户凭据。
在启动菜单搜索框中搜索“服务” -In Services找到所需的服务 - 右键单击并选择“登录”选项卡 - 选择“此帐户”并输入所需的内容/凭据 - 然后像往常一样启动服务
答案 5 :(得分:1)
我转到服务器控制台(在服务器机房中)并从那里启动服务。远程不会工作。
答案 6 :(得分:1)
在我发现有多余的“&gt;”之前也有这个错误我的.config文件中的字符。
因此,在冲压计算机之前,请先尝试仔细检查.config文件;)
答案 7 :(得分:0)
在我的情况下;我试图安装.Net 3.5服务到Windows 2012服务器。在服务器中安装了.Net 4.0框架。
我将目标服务框架更改为.Net 4.0。现在它工作正常。
答案 8 :(得分:0)
从包含服务的程序集执行的第一件事是Main方法。它必须采取特殊行动,或至少采取一项此类行动:
public static int Main()
{
Run(new System.ServiceProcess.ServiceBase[] { new YourServiceClass() });
}
这是我在创建第一个服务后在试验和错误会话后发现的。我没有使用VS.我确实使用了VS指南(Walkthrough: Creating a Windows Service Application in the Component Designer),而我宁愿使用这个指南:Creating a C# Service Step-by-Step: Lesson I。
没有合适的&#39; Main&#39;方法可执行文件立即完成,系统报告超过30秒超时:)
答案 9 :(得分:0)
答案 10 :(得分:0)
如果您的服务名称与实际的.exe文件名不同,请确保您没有与位于同一文件夹中的服务同名的.exe,这会导致它失败。
在我的生活中,我有一项名为“索引读者”的服务。指向&#39;索引阅读器service.exe&#39;并在同一文件夹中的一个名为&#39; Index reader.exe&#39;。删除此问题解决了这个问题。
答案 11 :(得分:0)
我有同样的问题 但是在我的情况下,当我在发行时重建安装程序服务时。 再次安装该服务并运行, 该服务开始运行,没有任何问题
答案 12 :(得分:0)
当我看到这样的问题时,我总是先去检查事件查看器。它确实为初始调查和调试提供了更多重要的细节。
通常,我们会忘记事件查看器捕获未处理的.net运行时异常,这些异常可以在 Windows日志> 应用程序下找到,然后通过事件ID 1026 (。NET运行时)
进行过滤答案 13 :(得分:0)
我在尝试运行 .Net Core 3.0.0 Windows 服务时遇到了同样的问题。解决方案表明 here 对我有用。但这里是它的要点:
添加 Microsoft.Extensions.Hosting.WindowsServices
包
在 .UseWindowsService()
添加 IHostBuilder
以下是示例:
using Microsoft.Extensions.Hosting;
public static IHostBuilder CreateHostBuilder(string[] args) =>
Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
IHostEnvironment env = context.HostingEnvironment;
config.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
config.AddEnvironmentVariables();
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
})
.ConfigureLogging((context, logging) =>
{
logging.AddConfiguration(context.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.ConfigureServices((context, services) =>
{
services.AddHostedService<Worker>();
})
.UseWindowsService();