You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现函数每日仅允许调用一次的功能?(支持VB/C#)

实现函数每日仅执行一次的方案(VB.NET/C#)

核心思路是记录函数最后执行的日期,每次调用时对比当前日期:若日期不同则执行函数逻辑并更新记录;若日期相同则直接跳过。以下提供两种场景的实现方案:


VB.NET 实现

场景1:仅当前进程内生效(重启后重置)

用静态变量存储最后执行日期,进程运行期间保留记录:

' 静态变量存储最后执行日期,进程生命周期内有效
Private Shared lastRunDate As Date = Date.MinValue

Private Sub CreateLogger()
    ' 对比当前日期与最后执行日期
    If Date.Today <> lastRunDate Then
        Logger = New CustomLogger(Sub(value, Type)
                                      Dim tempFileLogPath = IO.Path.Combine("C:\temp", $"FileAttributer_{Today:yyyyMMdd}.txt")
                                      Dim consoleLogger = New ConsoleLogger()
                                      Dim textFileLogger = New TextFileLogger(tempFileLogPath)
                                      Dim compositeLogger = New CompositeLogger(consoleLogger, textFileLogger)
                                      value = $"{DateTime.Now:dd/MM/yyyy HH:mm:ss} - {value}"
                                      compositeLogger.Write(value, Type)
                                  End Sub)
        ' 更新最后执行日期为今日
        lastRunDate = Date.Today
    End If
End Sub

场景2:跨进程/重启后仍生效

用本地文件持久化存储最后执行日期,即使进程重启也能保留记录:

Private Sub CreateLogger()
    Dim runRecordPath = IO.Path.Combine("C:\temp", "LastRunDate.txt")
    Dim currentDate = Date.Today
    Dim lastRunDate As Date = Date.MinValue

    ' 读取已记录的执行日期
    If IO.File.Exists(runRecordPath) Then
        Date.TryParse(IO.File.ReadAllText(runRecordPath), lastRunDate)
    End If

    If currentDate <> lastRunDate Then
        Logger = New CustomLogger(Sub(value, Type)
                                      Dim tempFileLogPath = IO.Path.Combine("C:\temp", $"FileAttributer_{Today:yyyyMMdd}.txt")
                                      Dim consoleLogger = New ConsoleLogger()
                                      Dim textFileLogger = New TextFileLogger(tempFileLogPath)
                                      Dim compositeLogger = New CompositeLogger(consoleLogger, textFileLogger)
                                      value = $"{DateTime.Now:dd/MM/yyyy HH:mm:ss} - {value}"
                                      compositeLogger.Write(value, Type)
                                  End Sub)
        ' 将今日日期写入文件保存
        IO.File.WriteAllText(runRecordPath, currentDate.ToString("yyyyMMdd"))
    End If
End Sub

C# 实现

场景1:仅当前进程内生效

// 静态变量存储最后执行日期
private static DateTime _lastRunDate = DateTime.MinValue;

private void CreateLogger()
{
    if (DateTime.Today != _lastRunDate)
    {
        Logger = new CustomLogger((value, type) =>
        {
            string tempFileLogPath = Path.Combine(@"C:\temp", $"FileAttributer_{DateTime.Today:yyyyMMdd}.txt");
            ConsoleLogger consoleLogger = new ConsoleLogger();
            TextFileLogger textFileLogger = new TextFileLogger(tempFileLogPath);
            CompositeLogger compositeLogger = new CompositeLogger(consoleLogger, textFileLogger);
            value = $"{DateTime.Now:dd/MM/yyyy HH:mm:ss} - {value}";
            compositeLogger.Write(value, type);
        });
        _lastRunDate = DateTime.Today;
    }
}

场景2:跨进程/重启后仍生效

private void CreateLogger()
{
    string runRecordPath = Path.Combine(@"C:\temp", "LastRunDate.txt");
    DateTime currentDate = DateTime.Today;
    DateTime lastRunDate = DateTime.MinValue;

    if (File.Exists(runRecordPath))
    {
        DateTime.TryParse(File.ReadAllText(runRecordPath), out lastRunDate);
    }

    if (currentDate != lastRunDate)
    {
        Logger = new CustomLogger((value, type) =>
        {
            string tempFileLogPath = Path.Combine(@"C:\temp", $"FileAttributer_{DateTime.Today:yyyyMMdd}.txt");
            ConsoleLogger consoleLogger = new ConsoleLogger();
            TextFileLogger textFileLogger = new TextFileLogger(tempFileLogPath);
            CompositeLogger compositeLogger = new CompositeLogger(consoleLogger, textFileLogger);
            value = $"{DateTime.Now:dd/MM/yyyy HH:mm:ss} - {value}";
            compositeLogger.Write(value, type);
        });
        File.WriteAllText(runRecordPath, currentDate.ToString("yyyyMMdd"));
    }
}

方案选择说明

  • 静态变量方案:实现简单,仅适用于单进程且无需保留重启前记录的场景。
  • 文件持久化方案:适用于需要跨进程、重启后仍需保留执行记录的场景,注意确保程序有文件读写权限。

内容的提问来源于stack exchange,提问作者HyperSquid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:35:20