Mac 操作系统中控制台应用程序内的异步/等待用法

问题描述 投票:0回答:1

我对 Swift 中的同步/等待概念还很陌生。所以我为自己开发了一个小游乐场:

import Foundation

func dummyLoop() async {
    print("inside dummy fcn")
    for i in 0 ..< 10 {
        if Task.isCancelled {
            return
        }
        print("Loop \(i)")
        try? await Task.sleep(for: .seconds(1))
    }
}

let task = Task(priority: .high) {
    await dummyLoop()
}

print("Press any key to stop task...")
_ = readLine()
task.cancel()
print("Press any key to stop finish app...")
_ = readLine()
print("Ciao")

所以我想运行一些虚拟循环并在控制台中按 Enter 后停止它。但我看到任务关闭根本没有执行。我发现这种行为在某种程度上与 RunLoop 有关...有人可以解释一下这里发生了什么吗?我应该如何运行要在控制台应用程序中并行执行的任务?

swift async-await task
1个回答
0
投票

Task.init
继承参与者上下文,在本例中是主要参与者。主要参与者在主线程上运行,但主线程被
readLine
阻塞,因此什么也做不了。

您可以使用

Task.detached
来代替,它在协作线程池中的某个线程上运行任务。

let task = Task.detached(priority: .high) {
    await dummyLoop()
}
© www.soinside.com 2019 - 2024. All rights reserved.