【问题标题】:C# Timer to run even if system is switched off or restarted即使系统关闭或重新启动,C# 计时器也会运行
【发布时间】:2014-09-27 02:27:09
【问题描述】:

我正在尝试创建一个脚本,它会在 1 天后显示一个弹出窗口。据我所知,我可以使用 Thread.Stop 或 System.Timers 或许多其他方式来做到这一点。但是每个方法的问题是计算机必须为这些方法中的每一种持续运行才能在我想要的时间给出期望的结果。基本上我希望脚本从我的程序安装开始,等待 24 小时,然后显示一个消息框。如果此时计算机已打开,即 24 小时后,它应该在下次启动时显示消息框,但前提是 24 小时或更长时间已过。请帮助,我无法找到合适的解决方案。任何帮助将不胜感激。我认为可以通过获取 dateTime.Now 并将其放入文件中来实现,然后每隔一小时左右将当前系统时间与文件中的时间进行比较,如果已经过了 24 小时或更长时间,则显示消息框。请帮忙

【问题讨论】:

    标签: c# timer


    【解决方案1】:

    如果您需要弹出一个消息框,那么您将需要一个 Windows 窗体应用程序。以下是它的工作流程:

    1. 应用程序需要通过数据库或文件保存数据。
    2. 当应用程序首次加载时,它会检查数据库或文件中的TriggerDate 条目。
    3. 如果TriggerDate 存在,请提取此日期并将其与今天的日期和时间进行比较。如果当前日期和时间超过了我们的TriggerDate,则显示消息框。使用当前日期和时间加上 24 小时重新创建 TriggerDate
    4. 如果 TriggerDate 不存在,则创建它,并用当前日期和时间加上 24 小时来填充(例如 DateTime.Now.AddHours(24))。
    5. 使用Threading.Thread.Sleep() 休眠 5 分钟。
    6. 跳到第 3 步并重复。

    编辑

    代码将是这样的:

    private const string TriggerFile = @"C:\TriggerData\trigger.txt";
    private DateTime _triggerDate;
    
    if (!File.Exists(TriggerFile))
    {
        using (StreamWriter sw = File.CreateText(TriggerFile))
        {
            sw.WriteLine(DateTime.Now.AddHours(24));
        }
    }
    using (StreamReader sr = File.OpenText(TriggerFile))
    {
        _triggerDate = DateTime.Parse(sr.ReadToEnd());
    }
    while (true)
    {
        if (DateTime.Now >= _triggerDate)
        {
            MessageBox.Show(@"Alert!");
    
            using (StreamWriter sw = File.CreateText(TriggerFile))
            {
                sw.WriteLine(DateTime.Now.AddHours(24));
                _triggerDate = DateTime.Now.AddHours(24);
            }
        }
        System.Threading.Thread.Sleep(60000*5); // Sleep for 5 minutes
    }
    

    你可能不想做while(true)。你想实现一种退出程序的方法。

    【讨论】:

    • 请告诉我如何执行步骤 1,2 和 3.. 我也想这样做,只是无法创建这些步骤的源代码
    • 工作得很好......不得不稍微修改......使用 StreamWriter 而不是 File.CreateText
    • 很高兴你能成功。我的例子只是一个简单的例子。我知道你必须根据你的场景修改它。
    【解决方案2】:

    如果我理解正确,您可以使用一种方法来保存“开始日期”。您可以保存计时器的开始日期并从脚本中读取值,这样您就可以计算自您为开始日期分配值的那一刻起是否经过了 24 小时或更长时间。您可以使用简单的 TXT 文件来保存该值。

    【讨论】:

    • 如果您能详细说明一下,您将不胜感激
    【解决方案3】:

    我看到了两种实现方式:

    • 简单的方法(但与 C# 不严格相关)是使用任务调度程序并创建一个每 24 小时运行一次 C# 程序的任务。从安装程序执行此操作的一种方法是使用SchTasks.exe 工具。此方法允许您在工作完成后退出程序,而无需显式等待下一次运行。
    • 更难的方法:创建一个 Windows 服务,这是一个专门设计用于在主机上永久运行的程序。不过,这些程序的编写技术要稍微高一些。你可以找到更多关于服务的解释here。但是,您可能不想采用这种方式,因为服务无法显示弹出窗口等用户界面。

    【讨论】:

    • thnx buddy.. 只是对任务调度程序持怀疑态度...如果没有什么容易解决的,应该这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多