gpt4 book ai didi

f# - 将 .NET 4.5 异步适配到 F#

转载 作者:行者123 更新时间:2023-12-04 08:50:12 26 4
gpt4 key购买 nike

.NET 4.5 框架库相当广泛地集成了 C# 风格的基于任务的异步。在许多情况下,它们还继续公开 APM 样式的 Begin/End 方法对。 F# 可以轻松地将任一方法调整为 F# 风格的异步计算。

我的问题是,考虑到在框架中以 Begin/End 和基于任务的异步方式实现的 IO 绑定(bind)操作,在适应 F# 异步时选择其中一个是否有性能或内存优势?

例如,在 .NET 4.5 中,System.IO.Stream两者都有BeginReadReadAsync .这意味着我可以做到这一点...

type System.IO.Stream with
member x.AsyncRead(buffer, offset, count) =
Async.FromBeginEnd(buffer, offset, count, x.BeginRead, x.EndRead)

或者我可以这样做...
type System.IO.Stream with
member x.AsyncRead(buffer, offset, count) =
x.ReadAsync(buffer, offset, count) |> Async.AwaitTask

有什么理由更喜欢其中一个吗?我能想到的主要区别是第二个扩展方法返回时读取操作已经开始,但第一个扩展方法不是这样。

最佳答案

一个 AsyncRead 扩展方法 ( implemented in terms of FromBeginEnd ) 已在 FSharp.Core 中定义。 AwaitTask 只是对 Task.ContinueWith 的一个薄包装.所以归结为 Task 的比较和 async ——这更有效,或者更适合这项工作。由于您正在使用 async s,唯一相关的区别是性能。我不是这方面的专家,但我认为 asyncTask使用 Task 解决相同的问题在 CPU 密集型操作方面具有优势。

编辑

我没有仔细阅读你的问题。我不知道确切的答案,但鉴于 Taskasync大致相等,我看不出有任何理由包装 Taskasync除非这是你唯一的选择。 Begin/End方法是较低级别、更轻量级的抽象,因此对于 async 来说似乎是更好的构建 block 。 s。

一个辅助的想法:AsyncRead未更改为使用 Task可能具有指导意义。

关于f# - 将 .NET 4.5 异步适配到 F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282552/

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