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" 可以自然地处理并隐式解释 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
}
有了新的任务表达式,这里解释一下:
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
。
显然 .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" 可以自然地处理并隐式解释 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
}
有了新的任务表达式,这里解释一下: 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
。