F#唤醒程序

时间:2011-11-22 20:33:36

标签: f#

我有这个要求:我的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()并不是一个好主意。 请提供帮助。 谢谢, 约翰

4 个答案:

答案 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