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

24

显然,.NET的全新 ValueTask<T>Task<T>精简版本。这很酷,但如果以前我必须使用 Async.AwaitTask将我的 F# 异步工作流程与 Task 集成,那么现在我应该如何处理 ValueTask 呢?


2
有一个RFC提议在F#中添加对AwaitValueTask函数的支持。https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1021-value-task-interop.md - Aaron M. Eshbach
你可以很容易地通过更原始的Async.FromContinuations来实现Async.AwaitTask - 我想你也可以对ValueTask<'t>做同样的事情。 - scrwtp
3个回答

27

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


3

3

我的 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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接