es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Diferencia de concurrencia estructurada entre addTask y addTaskUnlessCancelled en Swift

Tengo confusión entre llamar a addTask() y addTaskUnlessCancelled. Según la definición, addTask() en su grupo añadirá incondicionalmente una nueva tarea al grupo.

func testCancellation() async {
    do {
        try await withThrowingTaskGroup(of: Void.self) { group -> Void in
            group.addTaskUnlessCancelled {
                print("añadida")
                try await Task.sleep(nanoseconds: 1_000_000_000)
                throw ExampleError.badURL
            }
            group.addTaskUnlessCancelled {
                print("añadida")
                try await Task.sleep(nanoseconds: 2_000_000_000)
                print("La tarea está cancelada: \(Task.isCancelled)")
            }
            group.addTaskUnlessCancelled {
                print("añadida")
                try await Task.sleep(nanoseconds: 5_000_000_000)
                print("La tarea está cancelada: \(Task.isCancelled)")
            }
            group.cancelAll()
            try await group.next()

        }
    } catch {
        print("Error lanzado: \(error.localizedDescription)")
    }
}

Si queremos evitar añadir tareas a un grupo cancelado, tenemos que usar el método addTaskUnlessCancelled(). Pero incluso con group.cancelAll(), está añadiendo todas las tareas al grupo. Entonces, ¿cuál es la diferencia aquí y el retorno de valor que devuelve true solo si Task arroja algún error?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El método addTaskUnlessCancelled(), a diferencia de addTask(), verificará si el grupo de tareas ha sido cancelado antes de agregar la tarea. Si el grupo ha sido cancelado, la tarea no se agregará.

    En el código proporcionado, las tres tareas se agregan al grupo antes de que se llame a group.cancelAll(). Sin embargo, debido a que la segunda y tercera tarea utilizan addTaskUnlessCancelled(), no se ejecutarán cuando se llame a group.cancelAll(). Por otro lado, la primera tarea aún se ejecutará porque se agregó incondicionalmente con addTask().

    El método addTaskUnlessCancelled() no devuelve un valor que indique si la tarea arrojó un error o no. Su propósito es evitar agregar tareas a un grupo cancelado. El tipo de Task en sí mismo tiene una propiedad isCancelled, que se puede utilizar para verificar si una tarea ha sido cancelada o no.

Comments are closed.