Windows服务在生产PC上不执行任何操作

时间:2014-10-08 16:52:52

标签: c# windows-services quartz.net production

我有一个使用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);
    }
    //...
}

JobListget属性生成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);
    }
}

}

1 个答案:

答案 0 :(得分:0)

这结果是网络权限问题。该服务正在运行,它无法访问网络驱动器。所以我的问题确实是mi-specified。

尝试此操作后:https://serverfault.com/questions/177139/windows-service-cant-access-network-share我们最终通过将服务设置为在PC上作为特定用户帐户运行来使其工作。