asynchronous - 异步FromBeginEnd接口(interface)

标签 asynchronous f#

我有以下 C# 异步接口(interface):

x.BeginOperation(a:sting, b:string, c:string, d:string, g:string, ?q:string) : IAsyncResult
x.EndOperation(result:IAsyncResult) : IEnumerable<string>

我想在我的异步工作流程中使用它并获取 Async<'T>代表计算的对象。

我想 Async.FromBeginEnd 是可行的方法,但我很难尝试将开始/结束操作方法传递给它。 BeginOperation 有太多参数加上可选参数(加上我并没有真正设法将我的注意力集中在签名中的 AsyncCallback * obj 上)。

从此接口(interface)获取异步的正确方法是什么。谢谢。

最佳答案

假设您的接口(interface)声明如下:

type IMyInterface =
    abstract member BeginOperation :
        (string * string * string * string * string * string option) ->
        IAsyncResult
    abstract member EndOperation : IAsyncResult -> string seq

您应该能够创建一个Async<'T>使用像这样的小辅助函数:

let toAsync (x : IMyInterface) =
    let beginAction (callback, values : obj) =
        match values with
        | :? (string * string * string * string * string * string option) as v ->
            x.BeginOperation v
        | _ -> failwith "Unexpected values"

    Async.FromBeginEnd (beginAction, x.EndOperation)

内在beginAction辅助函数的签名为 'a * obj -> IAsyncResult ,这意味着它需要一个泛型类型 'a 的元组(在 C# 中,它通常表示为 T )和 System.Object ,并返回 IAsyncResult实例。

对于Async.FromBeginEnd ,这是 beginAction 所需的签名.

界面的EndOperation方法已经具有正确的签名,因此可以不加修改地传入。

toAsync的完整签名功能是IMyInterface -> Async<seq<string>> .

关于asynchronous - 异步FromBeginEnd接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23218093/

相关文章:

javascript - 如何等待所有promise都解决后再返回数据?

javascript - 等待发出的消息的响应?

java - Jersey 异步下载 zip 文件

f# - 换行符和格式化程序

.net - 使用 F# 和 Eto.Forms 捕获箭头键

f# - 如果我在 C# 商店工作并尝试编写 F# 只是为了依赖 ILSpy 进行转换,存在哪些风险?

syntax - 目的是什么??在 F# 中?

list - 在 F# 中过滤列表的最佳功能方式

swift - RealityKit - 异步模型加载不起作用

python - python asyncIO如何暂停和恢复任务?