假設它是 15 號,我的函式運行,如果該函式在 15 號再次呼叫,它將不會運行。但如果日期是 16 日并且呼叫了該函式,則允許它運行。我怎么能做到這一點?下面的 PS 代碼是 Visual Basic,但是 C# 可以作為答案
Private Sub CreateLogger()
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)
End Sub
uj5u.com熱心網友回復:
我想這與檔案有關,所以最后你不會每天有多個檔案。
您可以檢查檔案以查看它是否是之前創建的。
uj5u.com熱心網友回復:
我會將上次呼叫的時間存盤在一個變數中,并在每次呼叫時更新它。它不需要包括一天中的時間,只需包括日期。每次呼叫函式時,檢查上次呼叫時間是否等于當前日期,如果是回傳/拋出錯誤以停止函式的其余部分。
uj5u.com熱心網友回復:
您必須在某處保存上次運行時間并每次比較當天。
這是一個非常簡單的例子:
using System;
using System.Threading;
public class Program
{
private static DateTime lastRunTime;
public static void Main()
{
for(int i=0; i < 10; i ) {
DoSomething();
Thread.Sleep(1000);
}
}
private static void DoSomething()
{
if (DateTime.Now.Day != lastRunTime.Day) {
lastRunTime = DateTime.Now;
Console.WriteLine($"Run: {lastRunTime}");
}
}
}
但我想,Radu Hatos 是對的。你應該更好地解釋一下,為什么你想讓你的行為表現得如此。
uj5u.com熱心網友回復:
您可以創建一個像下面這樣的簡單類來管理您的呼叫。(這只是一個非常簡單的例子)
public abstract class ExecutionManager
{
protected string ActionKey { get; }
public ExecutionManager(string actionKey)
{
ActionKey = actionKey;
}
protected abstract DateTime GetLastExecution();
protected abstract void SetLastExecution(DateTime dateTime);
public void OncePerDay(Action action)
{
if (GetLastExecution().Date != DateTime.Now.Date)
{
SetLastExecution(DateTime.Now);
action();
}
}
}
然后,您將根據需要實作此抽象類:如果您在單臺機器上運行應用程式(例如控制臺應用程式),您可以實作注冊表版本或檔案版本來存盤 lats 呼叫日期/時間。
如果您在多臺服務器上運行多個實體,則必須將資訊存盤在例如資料庫或共享檔案夾中(這里有一些復雜的相互排除問題需要管理)
您將在下面找到一個非常簡單的實作,其中包含用于單臺計算機方案的檔案存盤:
public class LADExecutionManager : ExecutionManager
{
private static string FilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyApplicationName");
public LADExecutionManager(string actionKey) : base(actionKey)
{
if (!File.Exists(FilePath))
Directory.CreateDirectory(FilePath);
}
protected string FileName => Path.Combine(FilePath, $"{ActionKey}.txt");
protected override DateTime GetLastExecution()
{
try
{
var sDate = File.ReadAllLines(FileName).First();
return DateTime.Parse(sDate);
}
catch
{
return DateTime.MinValue;
}
}
protected override void SetLastExecution(DateTime dateTime)
{
File.WriteAllLines(FileName, new string[] { dateTime.ToLongDateString() });
}
}
要使用這些類,您需要撰寫類似的代碼
internal class Program
{
private static void Main(string[] args)
{
var em = new LADExecutionManager("MyActionKeyName");
em.OncePerDay(() => MyAction());
}
public static void MyAction()
{
// Action...
Debug.WriteLine("Executing Action");
}
}
您只需要在建構式中為每個方法設定一個操作鍵名稱(您可以使用反射來獲取方法名稱,但我認為這不是主題)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/529160.html
標籤:C#VB.net
