从两个不同的任务修改演员属性

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

Converter
是一个在后台做一些工作的对象。在 UI 上有一个按钮,允许用户停止
Converter
操作。该对象最多使用 5 个线程。为了增加/减少线程数,我使用了
Actor
,它也用于标记
isRunning
属性。骨架是这样的。

    fileprivate let MAX_THREADS = 5

    actor ConverterData {
        var threads: Int = 0
        var isRunning: Bool = false 

        func incThreads() {
            threads += 1
        }

        fun decThreads() {
            threads -= 1
        }

        func setIsRunning(_ flag: Bool) {
            isRunning = flag
        }
    }

    class Converter {
        private var converterData = ConverterData()

        func start() {
            Task {
                await converterData.setIsRunning(true)
                while await converterData.isRunning { // here always true
                    if await converterData.threads < MAX_THREADS {
                        await converterData.incThreads() // threads increase and the new number is seen by this if
                        // Create a new task
                        ...
                    }
                    try? await Task.sleep(nanoseconds: 1000000000)
                }
            }
        }

        func stop() {
            Task {
                await converterData.setIsRunning(false)
                // This change is seen here, in this task, but not in the previous task, inside the while.
                print(await converterData.isRunning) // correct: false
            }
        }
    }

如代码所示,使用注释,问题似乎如下:当我从

Task
更改actor属性时,其他任务看不到更改,但仍然只看到自己的更改。

也许我错过了演员背后的真正概念?

swift task actor swift-concurrency
© www.soinside.com 2019 - 2024. All rights reserved.