C# Windows服务在生产PC上不执行任何操作
我有一个使用Quartz.Net调度作业的应用程序。它作为winforms应用程序(带有启动和停止按钮)和Windows服务(其C# Windows服务在生产PC上不执行任何操作,c#,windows-services,quartz.net,production,C#,Windows Services,Quartz.net,Production,我有一个使用Quartz.Net调度作业的应用程序。它作为winforms应用程序(带有启动和停止按钮)和Windows服务(其OnStart()和OnStop()事件代码与winforms应用程序的启动和停止按钮代码匹配)在我的开发笔记本电脑上都能完美地工作。它们都在同一个解决方案中,使用相同的“模型”代码(在它自己的项目中) 如果我在生产计算机上运行winforms应用程序,它将正常工作,作业将按照预期的时间表执行。但是,如果我将其作为Windows服务安装并运行在生产PC上,则不会发生任何
OnStart()
和OnStop()
事件代码与winforms应用程序的启动和停止按钮代码匹配)在我的开发笔记本电脑上都能完美地工作。它们都在同一个解决方案中,使用相同的“模型”代码(在它自己的项目中)
如果我在生产计算机上运行winforms应用程序,它将正常工作,作业将按照预期的时间表执行。但是,如果我将其作为Windows服务安装并运行在生产PC上,则不会发生任何事情!作业不运行
我不知道如何调试这个。如果您对可能出现的问题有任何建议,请告诉我
另外,请让我知道我应该提供什么其他信息
哦-开发电脑运行的是Windows7,生产电脑运行的是Windows8.1!这可能是问题所在吗?我按照本教程构建了该服务:这并不表示部署到Windows 8需要做任何特殊的工作
这是否与环境变量有关(我对此一无所知)
以下是一些可能相关的代码:
服务:
namespace DataPump
{
public partial class DataPumpService : ServiceBase
{
private TaskManager _taskManager;
public DataPumpService()
{
InitializeComponent();
_taskManager = new TaskManager();
}
protected override void OnStart(string[] args)
{
_taskManager.Go();
}
protected override void OnStop()
{
_taskManager.Stop();
}
}
}
表格代码(不同项目):
从TaskManager
code中选择的代码(前两个分别引用的第三个项目):
其中JobList
是一个get
唯一的属性,它生成一个List
其中DatapumpJob
实现IInterrutableJob
,但添加了一个常见的特性,包括一个作业名,该作业名由从Make…
开始的三个方法使用,这三个方法都是TaskManager
class
此代码用于回答有关
ServiceBase.Run()
的注释中的问题:
Program.cs(自动生成):
名称空间数据泵
{
静态类程序
{
///
///应用程序的主要入口点。
///
静态void Main()
{
ServiceBase[]ServicesToRun;
ServicesToRun=新的ServiceBase[]
{
新的数据泵服务()
};
ServiceBase.Run(ServicesToRun);
}
}
}这是一个网络权限问题。服务正在运行,只是无法访问网络驱动器。所以我的问题确实是具体的
尝试后:我们最终将服务设置为在PC上以特定用户帐户运行,从而使其正常工作。应用程序中的代码在部署为服务时是否使用UI控件?使用UI控件的服务可能恰好在一台计算机上运行,但不能保证运行。我最近使用了该教程,所以我们相信它是正确的。此示例将事件写入事件日志。如果您将它们留在(放回)中,那么您应该能够从日志中记录服务的状态。Quartz计划程序需要在服务的生命周期内处于活动状态(在范围内)。您在哪里声明和实例化服务中的计划程序?如果您向我们展示您的一些代码,这会有所帮助。@user469104否使用UI stuff的代码是一个独立于实际计划和作业类的项目,第三个项目包含该服务。因此,当您以交互方式运行服务程序集时,服务程序集不应该与winforms内容有任何关系(我不认为),您使用的是运行服务的同一帐户吗?换句话说,服务帐户是否具有执行其工作所需的访问权限?
namespace DataPump
{
public partial class Form1 : Form
{
private TaskManager _taskManager = new TaskManager();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
_taskManager.Go(); //Loops infinitely, does not block
label1.Text = "Running...";
}
private void button2_Click(object sender, EventArgs e)
{
label1.Text = "Stopping...";
_taskManager.Stop();
label1.Text = "Idle";
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
_taskManager.Stop();
}
}
}
public class TaskManager
{
//...
private IScheduler _scheduler = StdSchedulerFactory.GetDefaultScheduler();
//...
public void Go()
{
if (_scheduler.GetCurrentlyExecutingJobs().Count() == 0)
{
_scheduler.Start();
_scheduler.AddCalendar(CalendarName, MakeSAPublicHolidayCalendar(), false, true);
foreach (DatapumpJob job in JobList)
{
_scheduler.ScheduleJob(MakeJob(job), MakeTriggerCron(job));
}
}
}
//...
public void Stop()
{
foreach (string name in _scheduler.GetCurrentlyExecutingJobs().Select(j => j.JobDetail.Key.Name))
{
_scheduler.Interrupt(new JobKey(name));
}
_scheduler.Shutdown(true);
}
//...
}
namespace DataPump
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new DataPumpService()
};
ServiceBase.Run(ServicesToRun);
}
}