gpt4 book ai didi

asynchronous - F#:从一个接受回调并返回取消句柄的函数创建一个异步

转载 作者:行者123 更新时间:2023-12-04 11:00:16 25 4
gpt4 key购买 nike

我是 F# 的新手,并试图围绕 C 库编写一个包装器模块。 C 库有一个具有此签名的函数:

handle* call_callback(void (*callback)(int));

它还有一个功能,可以通过取 handle*来取消上述功能。 :

void cancel_callback(handle* h);

我想将这对函数包装成 Async .

我熟悉 Async.FromContinuations如果不是因为需要调用 cancel_callback我可以包装 call_callback像这样:

let my_async = Async.FromContinuations(fun (succ, err, cancel) -> 
let handle = call_callback(succ)
)

这个问题是我需要掌握 handle并确保 cancel_callback(handle)如果此异步被取消,则被调用。我看不出有办法做到这一点。

最佳答案

有一个 Async.OnCancel 方法 ( https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/async.oncancel-method-%5Bfsharp%5D ),您可以等待它在取消任务时调用。或者,如果您希望在成功、取消和失败情况下调用它,只需将其包装在 IDisposable 中并在您的异步工作流程中“使用”它。希望我已经正确理解了您的用例。

async {
use _ = { new IDisposable with member __.Dispose() = cancel_callback() }
// Or if only on Cancel case
use! cancelHandler = Async.OnCancel(fun () -> cancel_callback())
// Do rest of your workflow here...
}

关于asynchronous - F#:从一个接受回调并返回取消句柄的函数创建一个异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58852170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com