IObservable подписаться и публиковать в Windows Service - PullRequest
2 голосов
/ 07 апреля 2011

Привет! Я пытаюсь реализовать службу Windows, которая подписывается и публикуется на IObservables.

Я использовал http://blogs.tedneward.com/2010/11/20/Windows+Service+In+F.aspx из блога Теда Ньюарда в качестве отправной точки.

type WindowsService() as this
    let createAndPublishObservables() =
    let obs1 = createObservable1()
    let obs2 = createObservable2()

    let combObs = Observable.CombineLatest(obs1, obs2) |> map ( fun (firstObsValue, secObsValue) -> firstObsValue + secObsValue)

    let obsUpdater = new ObsUpdater()

    let updaterPublish = combObs.subscribe( fun x -> obsUpdater.publish(x), ignore, fun () -> ())


    override this.OnStart(args:string[])
    base.OnStart(args)

    // and so on....

когда я пытаюсь отладить этот код, создается впечатление, что служба завершает свое выполнение, а подписчики и издатели выходят из области видимости (поэтому реактивность исчезает).

Нужно ли добавить что-то дополнительно, например, насос сообщений, чтобы это заработало? (если бы он работал в форме окна, но переход на службу до сих пор не увенчался успехом.)

Спасибо за помощь!

1 Ответ

2 голосов
/ 07 апреля 2011

Если вы ничего не делаете в своей службе Windows, она завершится сразу после запуска. Вы должны поддерживать приложение в действии. Обычный способ сделать это - создать отдельный поток, который будет выполнять вашу обработку бесконечно. Затем каким-то образом остановите поток в OnStop, чтобы служба умерла.

Убедитесь, что поток не является фоновым потоком. Если это так, приложение не будет работать.

Я не уверен, что вы имеете в виду, когда говорите, что ваш сервис будет публиковать наблюдаемые. Кто собирается подписаться на эти наблюдаемые?

...