当操作具有@MainActor装饰器时,作为Task运行的优先级是多少



我很好奇当Task的操作标记为@MainActor时,下面代码段中的异步block()将以什么优先级运行?

根据DispatchQueue文档,主队列总是以.userInteractive的qos运行。因此,我假设Task的@MainActor操作也将作为.userInteractive运行——毕竟只有一个主线程。

但是,由于我们为Task请求了自定义优先级,异步block将使用什么优先级运行?

Task<Void, Never>(priority: priority) { @MainActor in
doStuffOnMainQueue() // .userInteractive
await block()        // priority?
}

当您将@MainActor限定符添加到闭包时,它显然会在主体上运行。但当它到达await block()时,这意味着"挂起当前参与者(即本例中的主要参与者(,这样它就可以自由地做其他事情,并等待block()的结果。">

关于block()使用什么优先级的问题,这取决于它是如何声明的。假设block()只是您传递给这个方法的一个闭包,那么根据我的经验,它运行的是您提供给Taskpriority,而不是主要参与者。但是有很多变量(例如,您也可以为闭包参数指定@MainActor;您可以调用在其他参与者上运行的某个方法;等等(,所以如果没有看到可复制的示例,我们就无法获得更具体的信息。

但是,最重要的是,当您await某个东西时,等待的代码的参与者/优先级取决于您如何定义它,而不是您调用它的代码的上下文

最新更新