在没有windows任务调度程序的情况下调度exe

本文关键字:情况下 调度 exe 任务调度程序 windows | 更新日期: 2023-09-27 18:25:18

是否可以在不使用任何任务调度程序或sql调度程序的情况下调度.exe文件?我想做的是,我在C#中有一个文件,它将独立执行,但没有任何任务调度程序或sql调度程序。这背后的原因是安全问题。

在没有windows任务调度程序的情况下调度exe

或者,您可以在自己的C#应用程序中创建调度程序。

  1. 将您的应用程序构建为控制台应用程序
  2. 像这样将您的逻辑封装到自定义调度程序中。

     public class Schedule : ISchedule
    {
        readonly List<Timer> timers = new List<Timer>();
        public Schedule()
        {
        }
        public Timer Every(TimeSpan interval, Action action)
        {
            var timer = new Timer(_ => action(), null, new TimeSpan(), interval);
            timers.Add(timer);
            return timer;
        }
        public void Stop(Timer timer)
        {
            if (timer != null && timers.Contains(timer))
            {
                timer.Dispose();
                timers.Remove(timer);
            }
        }
    }
    public class MyMainClass
    {
       void Main(){
          var processor = new MyProcessor();    
          ISchedule scheduler = new Schedule();
          schedule.Every(TimeSpan.FromDays(1), processor.Run)
       }
    }
    public class MyProcessor
    {
       void Run(){
        //do more here
       }
     }
    
  3. 使用[Topshelf][1]将应用程序安装为windows服务

    [1] :https://github.com/Topshelf/Topshelf.Topshelf允许您创建一个控制台应用程序,并通过简单的命令将其安装/托管为windows服务。

您可以随时在任何地方部署可执行文件,并在注册表中创建一个启动条目,这里是:

HKEY_CURRENT_USER'Software'Microsoft'Windows'CurrentVersion'Run

请参阅MSDN

这样,您的可执行文件将在Windows启动时启动,您可以用程序设置执行任务的时间。

正如其他海报所提到的,谨慎的做法可能是至少重新审视一下标准任务调度程序路由,因为我想不出任何避免它的安全优势——再说一遍,我不知道你的情况。

我确实有一个项目,我需要做一些类似的事情——系统需要运行用户添加的任务——这些任务要么尽快运行,要么在给定的时间运行,要么以给定的间隔运行。

我把它设置为一个windows服务,设置为在启动时运行。该服务只需等待一段时间(通常约一分钟),然后检查数据库中是否有计划在上一次刻度和当前刻度之间运行的任何任务。这些任务维护在SQL数据库中。它的编写并不简单,但一旦实现,它似乎是可靠的。

一些注意事项-
时间不准确
错误处理至关重要-确保单个任务不会影响流程
要小心适当地处理边缘情况,这样你就不会在之间放弃任务

不过我还是要小心,不要过早地排除任务调度程序的路由。