我对 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 有关...有人可以解释一下这里发生了什么吗?我应该如何运行要在控制台应用程序中并行执行的任务?
Task.init
继承参与者上下文,在本例中是主要参与者。主要参与者在主线程上运行,但主线程被 readLine
阻塞,因此什么也做不了。
您可以使用
Task.detached
来代替,它在协作线程池中的某个线程上运行任务。
let task = Task.detached(priority: .high) {
await dummyLoop()
}