由於測試的原因,我希望能夠調整Quartz.Net目前認爲它是什麼時間,所以我不一定要等待幾小時,幾天或幾周爲了檢查我的代碼是否正常工作。Quartz.net - 調整和加速SystemTime導致失火的問題
爲此我創建了這個簡單的函數(它是在F#中,但可以很容易地在C#或其他語言來完成):
let SimulateTime = fun() ->
currentTime <- DateTimeOffset.UtcNow
timeDifferenceInSeconds <- (currentTime - lastCheckedTime).TotalSeconds
simulatedTime <- simulatedTime.AddSeconds((timeDifferenceInSeconds *scaleTimeBy))
lastCheckedTime <- currentTime
simulatedTime
凡currentTime的,lastCheckedTime和simulatedTime都將是DateTimeOffset類型,timeDifferenceInSeconds和scaleTimeBy都是float類型。
我再改SystemTime.Now和SystemTime.UtcNow使用上述功能如下:這是在我的前面的問題,可以找到here所示馬克塞曼
SystemTime.Now <-
Func<DateTimeOffset>(
fun() -> SimulateTime())
SystemTime.UtcNow <-
Func<DateTimeOffset>(
fun() -> SimulateTime())
。
現在,這主要是工作,除了它看起來像更長的功能導致它由一個相當寬的邊緣關閉。我的意思是,我的所有觸發器都會失火。例如,如果我有一個觸發器設置爲每小時發生一次,並將scaleTimeBy設置爲60.0,以便每秒傳遞一次計數爲一分鐘,它將永遠不會實時觸發。如果我有失火政策,那麼觸發器可以關閉,但它激活時列出的時間將遲於半小時標記(因此需要比本例中應該慢30秒)。
不過,我可以這樣做:
Console.WriteLine(SimulateTime())
Thread.Sleep(TimeSpan.FromSeconds(60.0))
Console.WriteLine(SimulateTime())
而且屏幕在這個例子中兩次輸出之間的差別將是整整一個鐘頭因此呼叫似乎並不像它應該被添加儘可能多比它的時間差。
任何人有任何建議如何解決這個問題或更好的方式來處理這個問題?
編輯: 所以SimulateTime功能的C#版本是這樣的:
public DateTimeOffset SimulateTime() {
currentTime = DateTimeOffset.UtcNow;
double timeDifference = (currentTime - lastCheckedTime).TotalSeconds;
simulatedTime = simulatedTime.AddSeconds(timeDifference * scaleTimeBy);
lastCheckedTime = currentTime
return simulatedTime;}
如果有助於解決這個問題的人。
雖然我現在沒有任何關於Quartz.Net,這聽起來像Quartz.Net,或您使用它的方式問題。我猜想有更多的C#開發人員比F#開發人員更熟悉這個庫,所以如果你用C#重現問題,可能有更好的機會得到答案,並且在這裏發佈C#代碼而不是F#... –
以上幫助更多? – Sean
還決定了是否可以通過在調用模擬時間函數時將timeDifference與當前時間一起打印出來來弄清楚事情。看起來Quartz.net通常會在幾乎同一時間進行5次調用,然後等待另一組調用。當測試這個等待時間似乎在大約20秒和大約0.001秒之間交替(主要問題中提到的30秒看起來更像是一個異常異常值,儘管20秒仍然很糟糕),任何人都知道這是爲什麼? – Sean