显然,.NET的全新 ValueTask<T>
是 Task<T>
的精简版本。这很酷,但如果以前我必须使用 Async.AwaitTask
将我的 F# 异步工作流程与 Task 集成,那么现在我应该如何处理 ValueTask 呢?
显然,.NET的全新 ValueTask<T>
是 Task<T>
的精简版本。这很酷,但如果以前我必须使用 Async.AwaitTask
将我的 F# 异步工作流程与 Task 集成,那么现在我应该如何处理 ValueTask 呢?
在实现 Async.AwaitValueTask
之前(感谢 Aaron),可以使用 ValueTask 的 AsTask 方法,并且现在可以使用 Async.AwaitTask
作为最简单的解决方案。
有了新的任务表达式,可以在这里解释: https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/task-expressions#value-tasks
我刚刚实现了一个返回System.Threading.Tasks.ValueTask
的System.IAsyncDisposable
:
interface IAsyncDisposable with
member _.DisposeAsync(): ValueTask =
task {
use _ = client
return ()
} |> ValueTask
ValueTask
。我的 OSS 项目“FusionTasks”可以自然地、隐含地处理和解释Task
和ValueTask
,就像 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
}
AwaitValueTask
函数的支持。https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1021-value-task-interop.md - Aaron M. EshbachAsync.FromContinuations
来实现Async.AwaitTask
- 我想你也可以对ValueTask<'t>
做同样的事情。 - scrwtp