XCode 16.4 日本語化計画
現在のタスクがキャンセルされた場合に直ちに呼び出されるキャンセルハンドラを使用して操作を実行します。
@backDeployed(before: macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0) func withTaskCancellationHandler<T>( operation: () async throws -> T, onCancel handler: () -> Void, isolation: isolated (any Actor)? = #isolation ) async rethrows -> T
これは、キャンセルの有無を協調的に確認し、それに対応する操作とは異なり、タスクがキャンセルされるとキャンセルハンドラが 常に 即座に 呼び出されます。例えば、操作がキャンセルの有無を全く確認しないコードを実行している場合でも、キャンセルハンドラは実行され、クリーンアップコードを実行する機会を提供します。
await withTaskCancellationHandler {
var sum = 0
while condition {
sum += 1
}
return sum
} onCancel: {
// This onCancel closure might execute concurrently with the operation.
condition.cancel()
}
すでにキャンセルされたタスクから withTaskCancellationHandler(operation:onCancel:) メソッドが呼び出された場合でも、operartion クロージャは常に呼び出されます。
すでにキャンセルされたタスクで withTaskCancellationHandler(operation:onCancel:) が使用されると、operation クロージャが実行される直前にキャンセルハンドラーが実行されます。
これにより、キャンセルハンドラーは、操作の実行時に実際の作業が実行されないようにするために、操作が アトミックに チェックする可能性のある外部の "キャンセル済み" フラグを設定できます。
operation クロージャは呼び出し元の実行コンテキスト上で実行され、クロージャ内に含まれるコードが実行コンテキストを一時停止または変更しない限り、そうしません。言い換えれば、withTaskCancellationHandler(operation:onCancel:) の潜在的な一時停止ポイントは、操作を実行する前に自動的に一時停止されることは決してありません。
操作の実行中にキャンセルが発生した場合、キャンセルハンドラーは操作と同時に実行されます。
ロックを取得するキャンセルハンドラは、デッドロックを回避するよう注意しなければなりません。キャンセルハンドラは、タスクまたは他のタスクに関連した内部ロックを保持したまま呼び出される場合があります。継続の再開など、タスクに対する他の操作も、同じ内部ロックを取得する可能性があります。したがって、キャンセルハンドラがロックを取得しなければならない場合、他のコードはそのロックを保持している間はタスクをキャンセルしたり、継続を再開したりしてはなりません。
タスクがキャンセルされたことを示すエラー。
このタスクをキャンセルします。
タスクの実行を停止すべきかどうかを示すブール値。
タスクの実行を停止すべきかどうかを示すブール値。
static func checkCancellation() throws
タスクがキャンセルされた場合エラーを throw します。
現在のタスクがキャンセルされた場合に直ちに呼び出されるキャンセルハンドラを使用して操作を実行します。