Avatar
そのまま継続しても、新しく乗せても、メインスレッドで実行されるはずなのに、脱法によって継続元が別のスレッドにいる場合ができてるから、コンパイラ的には意図せず、foo の方の末端の Task が false になってると考えれば辻褄はあう気がします。
3:49 AM
コンパイラがというよりは MainActor のglobalActorの実装が、ですかね。
3:51 AM
現在の DispatchQueue.async には @Sendable はついていないのだから、コンパイラのお気持ちとしては @MainActor func foo() { // ここはMainActor print("#0", Thread.current, Thread.current == Thread.main) DispatchQueue.global().async { // ここもMainActor print("#1", Thread.current, Thread.current == Thread.main) Task { // ここもMainActor print("#2", Thread.current, Thread.current == Thread.main) } } } (edited)
3:53 AM
だから、#1のprintが終わったあとのTaskをそのままそのスレッドで実行してもいいし、次のタイミングでメインスレッドで実行してもいい、と考えてよいはず。