我想学习如何async和let!工作在F#.我读过的所有文档都让人感到困惑.使用Async.RunSynchron运行异步块有什么意义?这是异步还是同步?看起来像是一个矛盾.
文档说Async.StartImmediate在当前线程中运行.如果它在同一个线程中运行,它对我来说看起来并不是异步......或者asyncs更像是协程而不是线程.如果是这样的话,他们什么时候退回?
引用MS文档:
使用let的代码行!开始计算,然后暂停线程直到结果可用,此时执行继续.
如果线程等待结果,我为什么要使用它?看起来像普通的旧函数调用.
Async.Parallel有什么作用?它接收一系列Async <'T>.为什么不能并行执行一系列普通函数?
我想我在这里缺少一些非常基本的东西.我想在我理解之后,所有文档和样本都将开始有意义.
我正在用F#构建一个.NET核心Web应用程序,我正在尝试设置Identity.我有一个基本版本的Register方法,它在数据库中创建一个用户并创建cookie:
[<HttpPost>]
[<AllowAnonymous>]
member this.Register([<FromBody>]model: RegisterViewModel) =
if not (isNull model.Email) && model.Password = model.ConfirmPassword then
let user = ApplicationUser(userName = model.Email, email = model.Email, password = model.Password)
let result = userManager.CreateAsync(user, model.Password) |> Async.AwaitTask |> Async.RunSynchronously
if result.Succeeded then
signInManager.SignInAsync(user, isPersistent = false) |> Async.AwaitTask |> Async.RunSynchronously
true
else
false
else
false
Run Code Online (Sandbox Code Playgroud)
但是,我的Login实现挂起:
[<HttpPost>]
[<AllowAnonymous>]
member this.Login([<FromBody>]model: LoginViewModel) =
if not (isNull model.Email && isNull model.Password) then
let result = signInManager.PasswordSignInAsync(model.Email, model.Password, false, lockoutOnFailure = false) |> Async.AwaitTask |> …Run Code Online (Sandbox Code Playgroud) 我正在尝试理解F#中的异步工作流程,但我发现有一部分我真的不明白,希望有人可以帮助我.
以下代码工作正常:
let asynWorkflow = async{
let! result = Stream.TryOpenAsync(partition) |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously asynWorkflow
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
Run Code Online (Sandbox Code Playgroud)
我定义了一个异步工作流,其中TryOpenAsync返回一个Task类型.我用Async.AwaitTask将它转换为Async.(副任务:"等待"任务?它不等待它只是转换它,是吗?我认为它与Task.Wait或await关键字无关).让我"等待"它!并返回它.要启动工作流,我使用RunSynchronously,它应该启动工作流并返回结果(绑定它).在结果上,我检查是否找不到流.
但现在是我的第一个问题.为什么我必须在另一个异步计算中包装TryOpenAsync调用并让它!("等待")吗?例如,以下代码不起作用:
let asynWorkflow = Stream.TryOpenAsync(partition) |> Async.AwaitTask
let stream = Async.RunSynchronously asynWorkflow
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
Run Code Online (Sandbox Code Playgroud)
我认为AwaitTask使它成为Async和RunSynchronously应该启动它.然后使用结果.我错过了什么?
我的第二个问题是为什么有"Async.Let!" 功能可用?也许是因为它不起作用或更好,为什么它不适用于以下代码?
let ``let!`` task = async{
let! result = task |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously ( ``let!`` (Stream.TryOpenAsync(partition)) )
|> fun …Run Code Online (Sandbox Code Playgroud)