detached(name:priority:operation:)
Runs the given throwing operation asynchronously as part of a new unstructured detached top-level task.
Declaration
@discardableResult static func detached(name: String? = nil, priority: TaskPriority? = nil, operation: sending @escaping @isolated(any) () async throws -> Success) -> Task<Success, any Error>Parameters
- name:
Human readable name of the task.
- priority:
The priority of the operation task. Omit this parameter or pass
nilto inherit the enclosing context’s base priority. - operation:
The operation to perform.
Return Value
A reference to the task.
Discussion
If the operation throws an error, it is caught by the Task and will be rethrown only when the task’s value is awaited. Take care to not accidentally dismiss errors by not awaiting on the task’s resulting value.
Don’t use a detached unstructured task if it’s possible to model the operation using structured concurrency features like child tasks. Child tasks inherit the parent task’s priority and task-local storage, and canceling a parent task automatically cancels all of its child tasks. You need to handle these considerations manually with a detached task.
You need to keep a reference to the task if you want to cancel it by calling the Task.cancel() method. Discarding your reference to a task doesn’t implicitly cancel that task, it only makes it impossible for you to explicitly cancel the task.