我有以下 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/