F#中如何处理ValueTask<T>?

How to deal with ValueTask<T> in F#?

显然 .NET 的全新 ValueTask<T>Task<T>leaner 版本。这很酷,但如果之前我不得不使用 Async.AwaitTask 将我的 F# 异步工作流与 Task 集成,那么我现在应该用 ValueTask 做什么?

Async.AwaitValueTask is implemented (thanks Aaron), one can use ValueTask's AsTask 方法之前,现在使用 Async.AwaitTask 作为最简单的解决方案。

我的 OSS 项目 "FusionTasks" 可以自然地处理并隐式解释 TaskValueTask 与 F# 相同 Async F# 异步工作流上的类型:

let asyncTest = async {
  use ms = new MemoryStream()

  // FusionTasks directly interpreted Task class in F# async-workflow block.
  do! ms.WriteAsync(data, 0, data.Length)
  do ms.Position <- 0L

  // FusionTasks directly interpreted Task<T> class in F# async-workflow block.
  let! length = ms.ReadAsync(data2, 0, data2.Length)
  do length |> should equal data2.Length
}

有了新的任务表达式,这里解释一下: https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/task-expressions#value-tasks

我刚刚实现了一个 System.IAsyncDisposable 其中 returns 一个 System.Threading.Tasks.ValueTask 像这样:

    interface IAsyncDisposable with
        member _.DisposeAsync(): ValueTask = 
            task {
                use _ = client
                return ()
            } |> ValueTask

您可以看到我只是将任务传送给 ValueTask