multithreading - F# 线程中的取消标记

标签 multithreading f# cancellationtokensource cancellation-token

我正在努力解决以下问题:

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

我发现 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)

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

如何做到这一点?在 C# 中, token 是直接传递的,我可以随时检查它。

最佳答案

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

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

关于multithreading - F# 线程中的取消标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65637876/

相关文章:

android - 在Android中,单击按钮时未出现加载屏幕

generics - F# 代码引用和泛型函数

f# - 从静态成员访问 let 绑定(bind)字段

c# - 使用 CancellationToken 取消 SQL Server 查询

c++ - 无链表的无锁编程

ios - swift Realm::In CorrectThreadException:从错误的线程访问 Realm

c# - 取消调用事件的异步方法

c# - CancellationTokenSource.Cancel 抛出 ObjectDisposedException

c# - 无效操作异常 : Collection was modified - although locking the collection

serialization - 如何在 F# 中将元组序列化为列表?