Написание опроса Windows службы - PullRequest
7 голосов
/ 22 сентября 2011

Я обычно пишу службы Windows на C #, но я делаю это на F #.Для опроса, как этот, я обычно использую класс, который я написал, который похож на BackgroundWorker.Он порождает фоновый поток и запускает метод OnWork через равные промежутки времени.(Полный код здесь [github] .)

Есть ли другой, возможно, лучший или более идиоматический способ сделать это в F #?Это мог бы быть лучший способ написать рабочий класс фона или встроенные альтернативы ему.

РЕДАКТИРОВАТЬ

Вот что я придумал, основываясь на предложении Джоэла.1017 *

Служба, использующая poll:

type MyService() =
  inherit System.ServiceProcess.ServiceBase()

  let mutable cts = new CancellationTokenSource()
  let interval = 2000

  override __.OnStart(_) = 
    let polling = Async.poll interval (fun () ->
      //do work
    )
    Async.Start(polling, cts.Token)

  override __.OnStop() = 
    cts.Cancel()
    cts.Dispose()
    cts <- new CancellationTokenSource()

  override __.Dispose(disposing) =
    if disposing then cts.Dispose()
    base.Dispose(true)

Хотелось бы, чтобы был способ избежать изменяемого CancellationTokenSource, но увы.

1 Ответ

5 голосов
/ 22 сентября 2011

У меня может возникнуть желание написать простой цикл в асинхронном рабочем процессе.Вы можете использовать do! Async.Sleep interval для того, чтобы спать между опросами - это имеет два преимущества: вы не связываете поток просто для того, чтобы он простаивал с Thread.Sleep, а do! автоматически проверяет отмену для вас, если вы передадитеCancellationToken в Async.Start.

Плюс, если ваша операция опроса включает в себя сетевое взаимодействие, вы уже находитесь в асинхронном рабочем процессе, что делает тривиальными асинхронные сетевые вызовы.

...