一尘不染

如何每天在特定时间在C#中调用方法?

c#

我已经搜索了SO,找到了有关Quartz.net的答案。但这对于我的项目来说似乎太大了。我想要一个等效的解决方案,但要更简单(最好是在代码中)(不需要外部库)。如何每天在特定时间调用方法?

我需要添加一些有关此的信息:

  • 最简单(最丑陋)的方法是每秒钟/分钟检查一次时间,并在正确的时间调用该方法

我想要一种更有效的方法来执行此操作,而无需不断检查时间,并且可以控制该作业是否完成。如果该方法失败(由于任何问题),则程序应知道要写入日志/发送电子邮件。这就是为什么我需要调用方法而不是安排工作的原因。

我发现此解决方案在Java固定时间在Java调用方法。C#中有类似的方法吗?

编辑:我已经做到了。我在void Main()中添加了一个参数,并创建了一个蝙蝠(由Windows Task
Scheduler计划)以使用此参数运行程序。程序运行,执行工作,然后退出。如果作业失败,则可以写入日志和发送电子邮件。这种方法很符合我的要求:)


阅读 276

收藏
2020-05-19

共1个答案

一尘不染

  • 创建一个可以满足您需求的控制台应用
  • 使用Windows“ 计划任务 ”功能在您需要运行该控制台应用程序时执行该应用程序

这就是您真正需要的!

更新: 如果要在应用程序中执行此操作,则有几种选择:

  • Windows Forms 应用程序中,您可以点击该Application.Idle事件并检查是否已到达一天中的时间来调用方法。仅当您的应用程序不忙于其他工作时才调用此方法。我认为,快速检查是否已达到目标时间不应对您的应用造成太大的压力。
  • 在ASP.NET Web应用程序中,有一些方法可以“模拟”发送计划的事件-查阅此CodeProject文章
  • 当然,您也可以在任何.NET应用程序中简单地“滚动自己的代码”-查看此CodeProject文章以获取示例实现

更新#2 :如果要每60分钟检查一次,则可以创建一个计时器,每60分钟唤醒一次,如果时间到了,它将调用该方法。

像这样:

using System.Timers;

const double interval60Minutes = 60 * 60 * 1000; // milliseconds to one hour

Timer checkForTime = new Timer(interval60Minutes);
checkForTime.Elapsed += new ElapsedEventHandler(checkForTime_Elapsed);
checkForTime.Enabled = true;

然后在您的事件处理程序中:

void checkForTime_Elapsed(object sender, ElapsedEventArgs e)
{
    if (timeIsReady())
    {
       SendEmail();
    }
}
2020-05-19