我有这个要求:我的F#程序将在上午11:00进行日常工作;我通常在上午8点开启我的电脑,因为我一直很忙,所以我总是忘记按时运行我的F#程序。所以,我想要一个功能,它可以检查现在和上午11:00之间的秒数,如果有3个小时,那么我的程序将睡眠10800秒,然后醒来并完成工作。我知道我可以使用Windows任务调度程序来完成这种工作,但是这样,我不会看到我的F#程序的输出,所以我必须这样做:
let wakeup() =
let today = DateTime.Today.ToShortDateString()
let beignTime = DateTime.Parse(today + " 11:00:00")
// Don’t know what to do yet!
对于函数wakeup(),如果当前时间在beginTime之前,我想返回int32秒数,如果当前时间晚于beginTime,则返回0。
let seconds2Go = wakeup()
if (seconds2Go > 0) then
Thread.Sleep(seconds2Go * 1000)
else
printfn "Do daily job!"
但我对如何编写函数wakeup()并不是一个好主意。 请提供帮助。 谢谢, 约翰
答案 0 :(得分:2)
这就是诀窍。你必须用CTRL + C来阻止它。
open System
open System.Threading
let (|TimeSpan|_|) value =
match TimeSpan.TryParse(value) with
| true, t -> Some t
| _ -> None
let runDaily time f =
let time = ref <| DateTime.Today.Add(time)
let rec loop() =
async {
if DateTime.Now >= !time then
time := (!time).AddDays(1.0)
f()
else do! Async.Sleep(1000)
return! loop()
}
use cts = new CancellationTokenSource()
Console.CancelKeyPress.Add(fun args -> cts.Cancel(); args.Cancel <- true)
try Async.RunSynchronously(loop(), cancellationToken = cts.Token)
with :? OperationCanceledException -> ()
[<EntryPoint>]
let main args =
match args with
| [|TimeSpan time|] ->
runDaily time (fun () ->
//TODO: program logic
)
0
| _ -> eprintfn "Usage: program.exe time"; 1
用法
program.exe 11:00 //run every day at 11AM
答案 1 :(得分:1)
为什么不在11:00使用Windows Scheduler运行程序?
答案 2 :(得分:1)
let wakeup () = 11.0*60.0*60.0 - (DateTime.Now - DateTime.Today).TotalSeconds |> int
答案 3 :(得分:1)
let wakeup () =
let beginTime = DateTime.Today + TimeSpan(11,0,0)
beginTime.Subtract(DateTime.Now).TotalSeconds |> int