简体   繁体   English

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

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

So apparently .NET's brand new ValueTask<T> is the leaner version of Task<T> .所以显然 .NET 的全新ValueTask<T>Task<T>精简版本。 That's cool, but if before I had to use Async.AwaitTask to integrate my F# Async workflows with Task, what should I do with ValueTask now?这很酷,但是如果在我必须使用Async.AwaitTask将我的 F# Async 工作流与 Task 集成之前,我现在应该如何处理 ValueTask?

在实现Async.AwaitValueTask之前(感谢 Aaron),可以使用 ValueTask 的AsTask方法, Async.AwaitTask使用Async.AwaitTask作为最简单的解决方案。

My OSS project "FusionTasks" can handle naturally and implicitly interprets both Task and ValueTask same as F# Async type on F# async workflow:我的 OSS 项目“FusionTasks”可以在 F# 异步工作流上自然地和隐式地解释TaskValueTask与 F# Async类型相同:

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
}

With the new task expressions, it is explained here: https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/task-expressions#value-tasks使用新的任务表达式,这里解释: https ://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/task-expressions#value-tasks

I just implemented a System.IAsyncDisposable which returns a System.Threading.Tasks.ValueTask like so:我刚刚实现了一个System.IAsyncDisposable ,它返回一个System.Threading.Tasks.ValueTask ,如下所示:

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

You can see that I'm just piping the task to ValueTask .您可以看到我只是将任务传递给ValueTask

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM