代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

NET中的内置后台调度系统?

  •  3
  • Lasse V. Karlsen  · 技术社区  · 15 年前

    我问,尽管我怀疑是否有这样的制度。

    基本上,我需要安排任务在将来的某个时候执行(通常不超过几秒钟,也可能是几分钟),并且有一些方法来取消请求,除非太晚。

    例如,代码如下所示:

    var x = Scheduler.Schedule(() => SomethingSomething(), TimeSpan.FromSeconds(5));
    ...
    x.Dispose(); // cancels the request
    

    在.NET中有这样的系统吗?第三方物流有什么可以帮我的吗?

    new Thread(new ThreadStart(() =>
    {
        Thread.Sleep(5000);
        SomethingSomething();
    })).Start();
    

    可能会有一些这样的任务需要执行,它们不需要按照任何特定的顺序执行,除非接近它们的截止日期,而且它们是否具有类似实时性能的概念并不重要。我只是想避免为每一个这样的动作都设置一个单独的线程。

    6 回复  |  直到 15 年前
        1
  •  5
  •   Lucero    15 年前

    System.Threading.Timer System.Timers.Timer . 请注意,这些类在技术上与WinForms计时器组件有很大的不同。

        2
  •  3
  •   Tom Cabanski    15 年前

    quartz.net (开源)。

        3
  •  3
  •   Rusty    15 年前

    嗯…..实际上是你 照你说的做。。。。

      IDisposable kill = null;
    
      kill = Scheduler.TaskPool.Schedule(() => DoSomething(), dueTime);
    
      kill.Dispose();
    

    使用Rx Reactive Framework 来自微软的朋友:)

    Rx真是太棒了。我几乎用它代替了所有的事件。真是太好吃了。。。

        4
  •  1
  •   Ben McCormack    15 年前

    虽然没有显式内置到.NET中,但您是否考虑过编写可以通过Windows计划任务来计划的EXE?如果您使用的是.NET,那么您可能会使用Windows,这不正是计划任务的用途吗?

    我不知道该怎么做 整合 在.NET解决方案中添加计划任务,但您肯定可以编写

        5
  •  1
  •   Erik Funkenbusch    15 年前

    如果您愿意使用.NET4,那么新的System.Threading.Tasks提供了一种为任务创建自定义调度程序的方法。我还没有仔细研究过它,但似乎您可以派生出自己的调度程序,并让它运行您认为合适的任务。

        6
  •  0
  •   Ohad Schneider    14 年前

    除了提供的答案外,还可以通过线程池完成:

    public static RegisteredWaitHandle Schedule(Action action, TimeSpan dueTime)
    {
        var handle = new ManualResetEvent(false);
        return ThreadPool.RegisterWaitForSingleObject(
                                             handle, 
                                             (s, t) =>
                                             {
                                                 action();
                                                 handle.Dispose();
                                             }, 
                                             null, 
                                             (int) dueTime.TotalMilliseconds, true);
    }
    

    这个 RegisteredWaitHandle Unregister