我有一个使用Quartz.Net安排作业的应用程序。它适用于我的开发笔记本电脑,既可以作为winforms应用程序(带有启动和停止按钮),也可以作为Windows服务,其OnStart()
和OnStop()
事件代码与winforms应用程序的开始和停止按钮代码相匹配。他们使用相同的"模型"在同一解决方案中。代码(在自己的项目中)。
如果我在生产计算机上运行winforms应用程序它运行正常,则按预期执行作业。但是,如果我在生产PC上安装并运行它作为Windows服务,则没有任何反应!这些工作没有运行。
我不知道如何调试它。如果您对可能出现的问题有任何建议,请与我们联系。
另请告诉我我应该提供的其他信息。
哦 - 开发PC正在运行Windows 7,生产PC正在运行Windows 8.1!这可能是问题吗?我按照本教程构建了该服务:http://msdn.microsoft.com/en-us/library/zt39148a(v=vs.110).aspx并不表示在部署到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();
}
}
}
表单代码(不同的项目):
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();
}
}
}
从TaskManager
代码中选择的代码(第三个项目,前两个参考):
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);
}
//...
}
JobList
仅get
属性生成List<DatapumpJob>
,其中DatapumpJob
实现IInterrutableJob
但添加了常用功能,包括可供其使用的作业名称开始Make...
的三个方法都是TaskManager
类中的私有方法。
此代码用于回答有关ServiceBase.Run()
的评论中的问题:
Program.cs(自动生成):
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);
}
}
}
答案 0 :(得分:0)
这结果是网络权限问题。该服务正在运行,它无法访问网络驱动器。所以我的问题确实是mi-specified。
尝试此操作后:https://serverfault.com/questions/177139/windows-service-cant-access-network-share我们最终通过将服务设置为在PC上作为特定用户帐户运行来使其工作。