【问题标题】:how to run code depending on the time如何根据时间运行代码
【发布时间】:2013-10-19 22:01:00
【问题描述】:

我有一个小问题。没找到合适的标题,抱歉

我的数据库中有一个时间列,我想在currenttime==timeValueAtMyDatabase 时做一些事情(不重要)。如何?

if(currenttime==timeValueAtMyDatabase)
{
   //do something
}

【问题讨论】:

  • 什么样的应用程序? ASP.Net、WinForm、WPF?你不能使用操作系统调度程序吗?
  • 使用 Windows 调度程序或 Quartz.NET。
  • Asmx.我正在尝试推送通知
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @millimoose:ASMX(或一般的 ASP.NET)的执行模型使长时间运行的请求成为一个非常糟糕的主意。这是简单的请求/响应。除了响应之外,没有其他能力做任何事情。这是一段古老的代码,自 2001 年的 .NET 1.0 以来几乎没有变化。

标签: c# asmx


【解决方案1】:

如果您对在不同线程中执行的代码感到满意,并且可以使用您想要的任何库(在本例中为 Rx),我个人更喜欢这种方法:

Observable.Timer(timeToDoTheThing).Subscribe(codeToRun);

timeToDoTheThing 是代码应该执行的时间,codeToRun 是到达时间时将运行的代码(以带一个长参数的 void 返回委托的形式)。

注意事项:

  1. 如果提供的时间是过去的,事件将立即发生。
  2. 事件将在后台线程中执行。您可以通过提供调度程序来控制它在哪个线程中运行,但这有点复杂,我更喜欢让我的代码线程安全,而不是试图控制哪些线程执行哪些代码块。

下面是一个完整的程序来说明这一点。您需要将 Rx-Main NuGet 包安装到项目中,以便它能够针对 .NET 4+ 工作和构建。

using System;
using System.Reactive.Linq;
using System.Threading;

namespace Test
{
    public class Class
    {
        public static void Main()
        {
            var timeToDoTheThing = new DateTimeOffset(2013, 10, 19, 22, 19, 30, TimeSpan.Zero);
            Action<long> codeToRun = _ => Console.WriteLine("It is time.");
            Observable.Timer(timeToDoTheThing).Subscribe(codeToRun);

            Thread.Sleep(100000);
        }
    }
}

【讨论】:

  • 这就是我想要的。非常感谢。
【解决方案2】:

如果这是一个 Windows 窗体应用程序,您可以使用计时器并检查某些条目是否小于 DateTime.Now

如果是 Web 应用程序,您可以使用 cron 作业。查看以下链接:Creating Cron Jobs in C#

【讨论】:

    【解决方案3】:

    使用按适当间隔计时的计时器控件。 在任何时候都将当前时间与数据库中的时间进行比较。 您将需要考虑差异。例如,如果它在 0.1 秒、1.1 秒、2.1 秒处滴答作响,而您的数据库中的时间是 1 秒。 您必须找到一种适当的方法来解释这些差异。

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多