编写轮询 Windows 服务

2024-01-04

I usually write Windows services in C# but I'm giving it a go in F#. For a polling serivce, like this one, I ordinarily use a class I've written, which is similar to BackgroundWorker http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx. It spawns a background thread and fires an OnWork method at regular intervals. (Complete code is here [github] https://gist.github.com/1235595.)

在 F# 中是否有另一种可能更好或更惯用的方法来执行此操作?这可能是编写轮询后台工作类或其内置替代方案的更好方法。

EDIT

这是我根据乔尔的建议想到的。

module Async =
  open System.Diagnostics

  let poll interval work =
    let sw = Stopwatch()
    let rec loop() =
      async {
        sw.Restart()
        work()
        sw.Stop()
        let elapsed = int sw.ElapsedMilliseconds
        if elapsed < interval then
          do! Async.Sleep(interval - elapsed)
        return! loop()
      }
    loop()

//Example
open System.Threading
let cts = new CancellationTokenSource()
Async.Start(Async.poll 2000 (fun () -> printfn "%A" DateTime.Now), cts.Token)
Thread.Sleep(TimeSpan.FromSeconds(10.0))
cts.Cancel()

该服务使用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, 可惜。


我可能想在异步工作流程中编写一个简单的循环。您可以使用do! Async.Sleep interval在轮询之间睡眠 - 这有两个优点:你不会只是为了让它闲置而占用一个线程Thread.Sleep,以及do!如果您通过了考试,系统会自动为您检查是否取消CancellationToken into Async.Start.

另外,如果您的轮询操作涉及网络通信,那么您已经处于异步工作流程中,使得进行异步网络调用变得微不足道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写轮询 Windows 服务 的相关文章

  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • 如何从 f# 返回一个空元组到 c#? [复制]

    这个问题在这里已经有答案了 我有这个类型正确的 C 函数 static System Tuple
  • 如何让一条记录实现一个接口?

    如果我有一个界面 type IData abstract member firstName string abstract member lastName string 如何定义符合此接口的记录类型 我尝试了如下所示 gt type Dat
  • Async.AwaitTask 在 f# 中如何工作?

    我知道 f 和 c 异步模型之间的主要区别在于 在 f 中 除非您调用 Async RunSynchronously 之类的内容 否则异步执行不会开始 在 C 中 当方法返回任务时 通常 并非总是 立即在后台线程中开始执行 Async Aw
  • windows服务启动超时

    有没有办法为每个服务设置不同的服务启动超时值 我可以使用 ServicesPipeTimeout 注册表项更改它 但它是每台计算机的 http support microsoft com kb 824344 http support mic
  • 具有异步操作的面向铁路的编程

    以前问过类似的问题 但不知何故我没有找到出路 再次尝试另一个例子 作为起点的代码 稍作修改 可在https ideone com zkQcIU https ideone com zkQcIU 它有一些识别问题Microsoft FSharp
  • 在类型扩展中重载运算符

    好的 所以我基本上尝试将绑定运算符添加到选项类型中 似乎我尝试的所有内容都有一些不明显的警告阻止我这样做 我怀疑这与 NET 类型系统的限制有关 并且可能与类型类无法在用户代码中实现的原因相同 不管怎样 我已经尝试了一些事情 首先 我尝试了
  • 对 F# 中任意嵌套级别的列表求和

    我正在尝试创建一个 F 函数 它将返回列表的总和int任意嵌套 IE 它将适用于list
  • F# 内联如何工作?

    对于 F 我的理解是您可以使用 inline 关键字在调用站点执行类型专门化 那是 val inline a gt b gt c when a or b static member a b gt c 约束条件是 a or b必须有一个静态成
  • Windows 服务不会自动启动

    我有一个用 Net 3 5 编写的 Windows 服务 设置为自动启动 但系统重新启动时它不会启动 据我了解 这可能是由于服务尝试启动时我的服务的依赖项未启动所致 我不知道我的服务取决于什么 我尝试了解决方法 将 Windows 打印后台
  • 使用列表匹配绑定值(没有编译器警告)

    假设我有一个需要一些时间的函数int参数 但在其中我将使用float32 我不想使用float32 i无处不在的功能 相反 我想这样做 let x float32 x let y float32 y let w float32 w let
  • 来自BackgroundWorker_RunWorkerCompleted 的TargetInitationException

    假设以下情况 表单有一个按钮 单击该按钮即可启动后台工作程序 在 RunWorkerCompleted 事件处理程序中 有一段代码会引发未处理的异常 该表单从Application Run 方法启动 public partial class
  • 在非 UI 线程上运行 RIA 服务

    我正在尝试从非 UI 线程进行 RIA 服务调用 我通过打开新线程和后台工作人员进行了调用 但对于这两种情况 回调都在 UI 线程上运行 是否可以在调用者线程而不是 UI 上执行回调 Thanks tl dr Use WCF 自行将结果编组
  • 何时使用接口,何时使用高阶函数?

    给定一个具有以下层的 ASP NET MVC 应用程序 UI 视图 CSS Javascript 等 控制器 服务 包含业务逻辑和数据访问 没有单独的数据访问层的原因是我正在使用 SQL 类型提供程序 以下代码可能不起作用 因为它只是原始草
  • 我可以使用太多后台工作线程吗?

    每次我的代码需要与网络或数据库通信时 我都会使用后台工作者 我是否可以使用太多 执行这些任务的正确方法是什么 如果我不使用后台工作程序 则如果远程主机关闭等 GUI 就会锁定 因此使用后台工作程序是我知道解决此问题的唯一方法 我是自学的 所
  • 我可以提供类型作为 F# 中类型提供程序的输入吗?

    这样做有什么我应该注意的陷阱吗 您知道处理我可能遇到的相同 pb 的现有代码吗 Thks 不幸的是 您无法将类型作为静态参数传递给类型提供程序 使用传递的静态参数MyProvider lt first argument 42 gt 必须是原
  • 跨线程操作在BackgroundWorker中无效

    我想在数据网格视图中显示有关表单加载的一些数据 我想要显示的数据有大量行 当我使用后台工作处理器时 它向我显示以下错误 My code private void backgroundWorker1 DoWork object sender
  • int -> int list 与类型 int -> IEnumerable<'a> 不兼容

    Given open System Linq 这是一个可以接受的表达方式 2 3 4 SelectMany fun n gt 1 n 但这不是 2 3 4 SelectMany fun n gt 1 n 错误消息显示 int gt int
  • 如何在 F# 中执行 Seq.takeWhile + 一项

    我想编写一个使用谓词过滤序列的函数 但结果还应该包括谓词返回 false 的第一个项目 如果 F 中有一个break关键字 逻辑将是这样的 let myFilter predicate s seq for item in s do yiel
  • 如何向 F# 项目添加第三方 dll 引用?

    我正在向我的 F 项目添加第三方 dll 引用 我在引用中添加了 dll 当我使用它时 即突出显示代码并执行 Alt Ent 我收到错误 命名空间或模块 AZROLESLib 未定义 我是不是错过了什么 简而言之 你必须使用 r path

随机推荐