Progressbar TaskStatus 确实监听所有异步运行

Progressbar TaskStatus does listen to all async runs

我举了一个小例子让你们明白我的意思。

通过运行,您会看到在单击黄色区域时会显示进度条...但我只希望在单击绿色区域时显示进度条。

我做错了什么或者这实际上是预期的行为吗?

import javafx.scene.layout.AnchorPane
import javafx.scene.layout.VBox
import tornadofx.*

class RunAsyncExample : View() {
    override val root = VBox()
    private val runAsyncOne: RunAsyncOne by inject()
    private val runAsyncTwo: RunAsyncTwo by inject()

    init {
        with(root) {
            minWidth = 400.0
            minHeight = 300.0
            add(runAsyncOne)
            add(runAsyncTwo)
        }
    }
}

class RunAsyncOne : View() {
    override val root = AnchorPane()

    init {
        with(root) {
            var checker = false
            minWidth = 400.0
            minHeight = 150.0
            style {
                backgroundColor += c("YELLOW")
            }
            setOnMouseClicked {
                checker = !checker
                runAsync {
                    while (checker) {
                        Thread.sleep(100)
                        println("AsyncOne")
                    }
                }
            }
        }
    }
}

class RunAsyncTwo : View() {
    override val root = VBox()
    private val status: TaskStatus by inject()

    init {
        with(root) {
            minWidth = 400.0
            minHeight = 150.0
            setOnMouseClicked {
                runAsync {
                    var b = 0.0
                    while (b < 100.0) {
                        b+=1
                        updateProgress(b, 100.0)
                        updateMessage("$b / 100.0")
                        Thread.sleep(100)
                        println("AsyncTwo")
                    }
                }
            }
            stackpane {
            visibleWhen { status.running }
                progressbar(status.progress) {
                    progress = 0.0
                    minWidth = 400.0
                }
                label(status.message)
            }
            style {
                backgroundColor += c("GREEN")
            }
        }
    }
}

当我点击进入绿色区域时:
当我在 AsyncTwo 为 运行、
时单击黄色区域 进度条正在改变,但我不想那样......

当您将 TaskStatus 对象注入您的视图时,您将获得一个 "global" TaskStatus 对象,该对象默认情况下会报告任何异步调用的状态。您想要的是为 RunAsyncTwo 视图创建一个本地 TaskStatus 对象并将其传递给 runAsync 调用。

如果您不将 TaskStatus 对象传递给 runAsync,将使用您范围的默认值,因此会出现您所看到的行为。这是第二个视图的本地 TaskStatus 对象的示例。另请注意,我使用更合理的语法来定义根节点,您绝对应该选择这种模式:)

class RunAsyncTwo : View() {
    private val status = TaskStatus()

    override val root = vbox {
        minWidth = 400.0
        minHeight = 150.0
        setOnMouseClicked {
            runAsync(status) {
                var b = 0.0
                while (b < 100.0) {
                    b += 1
                    updateProgress(b, 100.0)
                    updateMessage("$b / 100.0")
                    Thread.sleep(100)
                    println("AsyncTwo")
                }
            }
        }
        stackpane {
            visibleWhen(status.running)
            progressbar(status.progress) {
                progress = 0.0
                minWidth = 400.0
            }
            label(status.message)
        }
        style {
            backgroundColor += c("GREEN")
        }
    }
}