相关疑难解决方法(0)

F#的异步如何真正起作用?

我想学习如何asynclet!工作在F#.我读过的所有文档都让人感到困惑.使用Async.RunSynchron运行异步块有什么意义?这是异步还是同步?看起来像是一个矛盾.

文档说Async.StartImmediate在当前线程中运行.如果它在同一个线程中运行,它对我来说看起来并不是异步......或者asyncs更像是协程而不是线程.如果是这样的话,他们什么时候退回?

引用MS文档:

使用let的代码行!开始计算,然后暂停线程直到结果可用,此时执行继续.

如果线程等待结果,我为什么要使用它?看起来像普通的旧函数调用.

Async.Parallel有什么作用?它接收一系列Async <'T>.为什么不能并行执行一系列普通函数?

我想我在这里缺少一些非常基本的东西.我想在我理解之后,所有文档和样本都将开始有意义.

f# asynchronous

34
推荐指数
3
解决办法
5768
查看次数

PasswordSignInAsync在.Core App中挂起

我正在用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)

.net f# asp.net-identity asp.net-core

9
推荐指数
1
解决办法
575
查看次数

为什么我必须将Async <T>包装到另一个异步工作流中并让它!它?

我正在尝试理解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)

f# asynchronous let async-workflow

5
推荐指数
1
解决办法
142
查看次数