如何实现函数每日仅允许调用一次的功能?(支持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
相关产品推荐
相关产品推荐

