Concurrency之withTaskCancellationHandler(operation:onCancel:)

233 阅读1分钟

Operation执行过程中发生了Cancel,Operation会继续执行吗?

答: Operation会继续执行,并且OnCancel回调也会执行,可以在Operation中根据Task.isCancelled来决定是否继续向下执行

let t = Task {
    await withTaskCancellationHandler {
        try? await Task.sleep(for: .seconds(5))
        if Task.isCancelled {
            print("cancel in task")
        } else {
            print("execute task")
        }
    } onCancel: {
        print("cancel")
    }
}
t.cancel()

// 打印:
cancel
cancel in task

Operation如果还未执行,发生了CancelOperation还会执行吗?

答: 不会执行

什么时候OnCancel会被触发?

答: 当Task调用cancel方法时,会立即触发OnCancel回调

let t = Task {
    await withTaskCancellationHandler {
        try? await Task.sleep(for: .seconds(5))
    } onCancel: {
        print("cancel")
    }
}
t.cancel()

// 打印:
cancel

`