unj*_*nj2 12 c# f# asynchronous
我创建了一个返回此数据类型的F#库
FSharpAsync<IEnumerable<Tupel<DateTime,string>>>
Run Code Online (Sandbox Code Playgroud)
如何访问该FSharpAsync类型,以便我可以通过C#中的元组枚举并打印出内容?
Tom*_*cek 15
通常不建议公开F#类型,例如FSharpAsync在C#客户端将使用的公共接口中(请参阅F#组件设计准则).您可以使用Async.StartAsTask(在F#端)将操作公开Task<T>为易于使用的C#操作.
实际上,我还会用命名类型(捕获数据结构的含义)替换元组.元组可以在C#中使用,但它们在C#中不是惯用的:
// Assuming you have an operation like this
let asyncDoWork () : Async<seq<DateTime * string>> = (...)
// Define a named type that explains what the date-string pair means
type Item(created:DateTime, name:string) =
member x.Created = created
member x.Name = name
// Create a simple wrapper that wraps values into 'Item' type
let asyncDoWorkItems () =
async { let! res = asyncDoWork()
return seq { for (d, n) in res -> Item(d, n) } }
Run Code Online (Sandbox Code Playgroud)
现在,要将操作公开给C#,最佳做法是使用具有重载静态方法的类型.该方法将操作作为任务启动,并且一个重载指定取消令牌.这些的C#命名约定是添加Async到名称的末尾(与F#不重叠,后者添加Async到前面):
type Work =
static member DoWorkAsync() =
Async.StartAsTask(asyncDoWorkItems())
static member DoWorkAsync(cancellationToken) =
Async.StartAsTask(asyncDoWorkItems(), cancellationToken = cancellationToken)
Run Code Online (Sandbox Code Playgroud)
然后,您的C#代码可以使用Work.DoWorkAsync()和使用通常的C#样式的任务.它甚至可以使用await(可能)添加到C#5 的关键字.
| 归档时间: |
|
| 查看次数: |
1274 次 |
| 最近记录: |