F# 线程中的取消令牌

问题描述

我正在为以下问题苦苦挣扎:

我有一个系统,它有它的主要流程和两个可以启动和停止的后台线程,但它们通常运行时间很长,因为它们只在配置更改时停止。

我发现 F# 中的取消标记代码中的异步点被检查。 工作线程不执行任何异步操作;他们在做后台工作,但没有什么是异步的。

简化版本如下所示:

let workerThread (someParameters) =
    async {
        while true do
            setup some event driven system that has a callback when work is finished
            on callback,signal
            waitHandle.WaitOne()                
}

它是这样开始的:

Async.StartAsTask(workerThread parameter,cancellationToken = cancellationSource.Token)

由于系统中绝对没有任何异步,因此永远不会检查取消令牌,此外,我需要能够在由两个工作线程不断设置的事件驱动系统中手动检查它。

这是怎么做到的?在 C# 中,令牌是直接传递的,我可以随时查看。

解决方法

F# 将取消令牌传播到创建的任务,但如果工作函数在等待句柄时被阻塞,则它无法检查取消令牌。要解决此问题,您还应该等待取消令牌等待句柄:

let workerThread () =
  async {
      let! token = Async.CancellationToken // this way you can get cancellation token
      while true do
          // whatever
          WaitHandle.WaitAny([| waitHandle; token.WaitHandle |]) |> ignore
  }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...