【发布时间】:2021-06-25 17:45:08
【问题描述】:
我正在通过构建 ASP.NET Core 应用程序来学习 F#。我需要实现一个接口Microsoft.AspNetCore.Identity.IUserStore<'TUser>;此接口具有返回 Task 的方法,例如:
member this.CreateAsync (user : User, cancellationToken : CancellationToken) =
async {
let connectionString = configuration.GetConnectionString("SocialScoreApp")
let! rowCountResult = user |> createAsync connectionString
match rowCountResult with
| Ok _ -> return IdentityResult.Success
| Error e ->
let identityError = new IdentityError()
identityError.Description <- e
return IdentityResult.Failed(identityError)
} |> Async.StartAsTask
但是,根据文档,Async.StartAsTask“在线程池上执行计算”。但这是一个 I/O 绑定操作,所以我不希望涉及任何新线程。有什么方法可以实现吗?
编辑:这是createAsync代码供参考:
let createAsync (connectionString : string) (user:User) =
let sql = "..."
let args = dict [
// ...
]
async {
use connection = new SqlConnection(connectionString)
do! connection.OpenAsync() |> Async.AwaitTask
try
let! rowCount = connection.ExecuteAsync(sql, args) |> Async.AwaitTask
return Ok rowCount
with
| e -> return Error e.Message
}
【问题讨论】:
-
C# 是从哪里来的?
-
对不起,我想把 .NET。会修复的。
-
任务不是线程。它们本质上与异步计算相同 - promise 某事将在未来完成。您已经在异步计算中使用了任务。异步 ADO.NET 方法返回一个任务
-
我知道任务不是线程。但是
Async.StartAsTask似乎确实根据我对文档的解释在另一个线程上开始了计算。如果我删除|> Async.StartAsTask我会收到错误,因为返回类型是Async<IdentityResult>而不是Task<IdentityResult> -
Async和Task实例在运行时间方面有所不同:Async按需运行,但Task立即运行。因此,如果没有困扰您的“I/O 效应”,就不可能创建Task。
标签: .net asynchronous async-await f# task