【问题标题】:Async.Start not running expression when calledAsync.Start 调用时不运行表达式
【发布时间】:2019-10-11 18:05:37
【问题描述】:

我定义了以下表达式:

let startCycle = 
    FDebug.printfn "startCycle"
    let run2 = async {
        FDebug.printfn "Start"
        do! Async.Sleep 1000
        FDebug.printfn "End"
    }
    FDebug.printfn "Here"
    Async.Start (run2, Backend.State.controlBoard.CycleRunningTokenSource.Token)
    (0, "")

运行表达式“startCycle”时,我只看到以下输出:

startCycle
Here

由于某种原因,run2 函数在调用 Async.Start 时没有运行。系统没有做任何其他事情,所以 cpu 没有负载。关于我所缺少的任何想法?这适用于 F# 4.7 和 .NET Core 3。

编辑

我进行了以下更改以验证取消令牌没有被取消。

let startCycle = 
    FDebug.printfn "startCycle"
    let run2 = async {
        FDebug.printfn "Start"
        do! Async.Sleep 1000
        FDebug.printfn "End"
    }
    FDebug.printfn "%A" Backend.State.controlBoard.CycleRunningTokenSource.IsCancellationRequested
    Async.Start (run2, Backend.State.controlBoard.CycleRunningTokenSource.Token)
    (0, "")

输出:

startCycle
false

调用startCycle 的进程在调用startCycle 返回后仍在运行。这是 WPF 应用程序的一部分,用户可以输入命令,其中一个是 startCycle,它调用上述表达式。

编辑 2

在解决此处讨论的问题后,此问题已得到解决: F# not returning at end of expression

【问题讨论】:

  • Async.Start 不等待结果。它可以与Async.RunSynchronously 一起使用吗?
  • 调用startCycle后进程是否结束?

标签: .net-core f#


【解决方案1】:

一般而言,您上面的代码可以正常工作。

例如,它在 F# Interactive 中完美运行(就显示输出而言,有延迟)(这包括打印的输出):

> let startCycle = 
    printfn "startCycle"
    let run2 = async {
        printfn "Start"
        do! Async.Sleep 1000
        printfn "End"
    }
    printfn "Here"
    Async.Start (run2)
    (0, "");;
startCycle
Here
Start
val startCycle : int * string = (0, "")

> End

您看到此行为的可能原因有两个。

  1. Backend.State.controlBoard.CycleRunningTokenSource.Token 已处于取消状态(或在绑定此值后立即设置为取消)。这将阻止异步工作流启动。

  2. 进程在异步工作流启动之前退出。

【讨论】:

  • 这是 WPF 应用程序的一部分,其中来自 UI 的事件导致调用 startCycle 表达式。 startCycle 返回后,UI 仍在运行,但是否有可能在其自己的线程上触发事件,在 startCycle 返回后结束?
猜你喜欢
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多