如何解决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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。