Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在没有windows任务计划程序的情况下计划exe_C#_Windows_Task_Scheduler - Fatal编程技术网

C# 在没有windows任务计划程序的情况下计划exe

C# 在没有windows任务计划程序的情况下计划exe,c#,windows,task,scheduler,C#,Windows,Task,Scheduler,是否可以在不使用任何任务计划程序或sql计划程序的情况下计划.exe文件? 我想做的是,我有一个C#格式的文件,它将独立执行,但没有任何任务调度器或sql调度器。 这背后的原因是安全问题。您始终可以在任何位置部署可执行文件,并在注册表中创建启动项,如下所示: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 看 这样,,您的可执行文件将在Windows启动时启动,您可以通过编程设置执行任务的时间。正如其他海报所提到的

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

您始终可以在任何位置部署可执行文件,并在注册表中创建启动项,如下所示:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run


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

正如其他海报所提到的,至少重新审视一下标准的任务调度程序路由可能是明智的,因为我想不出避免它的任何安全优势-然后我也不知道您的选择情景

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

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

一些注意事项-
计时不准确
错误处理非常关键-确保单个任务不能中断流程
小心地适当地处理边缘情况,以免在两个刻度之间放弃任务


不过我还是要小心,不要过早地排除任务调度器路由

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

  • 将您的应用程序构建为控制台应用程序
  • 像这样将您的逻辑包装到自定义调度程序中

     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
       }
     }
    
    公共课程时间表:ISchedule
    {
    只读列表计时器=新列表();
    公共附表(
    {
    }
    公共计时器每隔(时间间隔、操作)
    {
    var timer=new timer(=>action(),null,new TimeSpan(),interval);
    定时器。添加(定时器);
    返回计时器;
    }
    公共无效停止(计时器)
    {
    if(timer!=null&&timers.Contains(timer))
    {
    timer.Dispose();
    定时器。移除(定时器);
    }
    }
    }
    公共类MyMainClass
    {
    void Main(){
    var processor=new MyProcessor();
    isSchedule scheduler=新计划();
    schedule.Every(TimeSpan.FromDays(1),processor.Run)
    }
    }
    公共类MyProcessor
    {
    无效运行(){
    //在这里做得更多
    }
    }
    
  • 使用[Topshelf][1]将应用程序安装为windows服务

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


  • 如果你能详细说明你所说的“日程安排”和“安全问题”,那将非常有帮助。如果您不想使用受支持的、可靠的、故障保护的Windows任务计划程序,您必须创建并安装自己的任务计划服务,该服务的功能与现有解决方案完全相同。要正确回答这一点并不容易,而且范围太广。tbh,我敢肯定,实现您自己版本的任务调度器将不太安全,并会给您带来更多问题……是的,您需要详细说明这些“安全问题”,原因有两个——一个是我们不知道我们建议的任何其他内容是否会与这些相同的问题相冲突“安全问题“另一个是,你可能对某些事情有误解,但在我们知道你在想什么之前,我们没有能力发现这一点并帮助纠正你。我总是在这些问题上左右为难——我本能地认为列出的要求不准确。我又一次站在了另一边,几个星期来我一直在为一个问题陷入困境,排除了所有显而易见的方法,因为这些微妙的问题需要花很多时间去梳理。有时候,这是太多的重述,如果你在这个问题上深入太多的细节,人们就会忽略它,并张贴明显的解决方案。不是说这是事实——只是有时候在没有全部背景的情况下要求回答是合理的。@Kelly问题本身就是“如果我不能使用现有的调度程序基础结构,我如何“调度”一个可执行文件?”(没有解释他们想如何精确地调度)。这个问题不清楚,过于宽泛,完全重复,答案是:要么滚动您自己的调度程序,要么将其放在“运行”注册表中,这一点以前已经得到了回答。这两种方法都有巨大的缺点,需要OP的反馈来确定它们是否可行。这就是为什么OP需要指定更多他们想要的内容。这是一个选项,但假设两件事:在需要启动应用程序之前有一个用户登录,并且将登录的用户具有运行和使用应用程序的适当权限。它也没有错误处理,所以如果你的应用程序启动失败,你不会注意到。因为任务调度程序不是一个选项,所以剩下的就不多了。为了避免崩溃,您应该始终在那里放置异常处理程序。此注册表项可以在没有管理员权限的情况下使用。您可以使用并不意味着您应该使用。OP的要求是错误的,可能是有害的。是的,我不是说这不是一个选项,但它确实有它的缺点。考虑到计划的任务是不可能的,这是最好的方法,因为绝对没有解释为什么,我认为这是一个相当好的解决方案。如果您不这么认为,请随意发布您的。虽然这是一个选项,但实现您自己的调度程序并不是一件小事。您展示的代码不会处理失败、服务重新启动或反馈。嗯,没错,仍然有一些复杂性。Topshelf的服务恢复选项可以覆盖服务重启和故障。Topshelf将在故障后使可执行文件再次运行,但这不会继续或停止