TaskBase

Espacio de nombres: Digi21.Tasks
Ensamblado: Digi21.DigiNG

Clase base abstracta para las tareas: implementa las propiedades de ITask y deja el método Execute a la clase derivada.

public abstract class TaskBase : ITask

Implementa: ITask

Clases derivadas, directas o indirectas: TaskMessageBox, TaskGotoPoint, TaskEntityGotoPoint, TaskAnimateEntity y TaskZoomEntity.

Los constructores son protected: solo una clase derivada puede crear un TaskBase. Las propiedades guardan el valor que reciben, sin validarlo.

Constructores

Constructor Descripción
TaskBase() Crea una tarea sin título, con gravedad Error.
TaskBase(string, TaskSeverity) Crea una tarea con título y gravedad.
TaskBase(string, TaskSeverity, string, string) Crea una tarea con título, gravedad, archivo de dibujo y módulo.
TaskBase(string, TaskSeverity, string, string, ITask[]) Crea una tarea con título, gravedad, archivo de dibujo, módulo y subtareas.

Propiedades

Las cinco propiedades tienen descriptor de acceso get y set públicos. El get es la implementación de la propiedad de ITask.

Propiedad Descripción
ITask[] Children Subtareas, o null. Consulta ITask.Children.
string DrawingFile Ruta del archivo de dibujo, o null. Consulta ITask.DrawingFile.
string Module Nombre del módulo, o null. Consulta ITask.Module.
TaskSeverity Severity Gravedad. Consulta ITask.Severity.
string Title Título, o null. Consulta ITask.Title.

Métodos

Método Descripción
abstract void Execute() Acción de la tarea. La clase derivada lo implementa. Consulta ITask.Execute.

Ejemplo

Este programa define una tarea que escribe su descripción en la consola y una clase que valida códigos y notifica el progreso, los resultados y las tareas con los delegados de Digi21.Tasks. Al final muestra el árbol de tareas:

using Digi21.Tasks;

var validador = new ValidadorCodigos();
validador.ProgressChanged += (sender, e) => Console.WriteLine($"{e.Progress} %");
validador.ResultsAdded += (sender, e) => Console.WriteLine(e.Message);

var tareas = new List<ITask>();
validador.TaskAdded += (sender, e) => tareas.Add(e.Task);

validador.Valida(["020101", "", "030205", "ABC"], "parcela.bin");

foreach (var tarea in tareas)
    MuestraTarea(tarea, 0);

// Children puede valer null: una tarea sin subtareas no tiene que crear un array vacío.
static void MuestraTarea(ITask tarea, int nivel)
{
    Console.WriteLine($"{new string(' ', nivel * 2)}[{tarea.Severity}] {tarea.Title} ({tarea.DrawingFile}, {tarea.Module})");
    foreach (var hija in tarea.Children ?? [])
        MuestraTarea(hija, nivel + 1);
}

// Tarea que escribe su descripción en la consola cuando se ejecuta.
sealed class TareaConsola : TaskBase
{
    public string Descripcion { get; }

    public TareaConsola(string titulo, string descripcion, TaskSeverity gravedad, string archivo, ITask[] hijas = null)
        : base(titulo, gravedad, archivo, "ValidadorCodigos", hijas)
    {
        Descripcion = descripcion;
    }

    public override void Execute() => Console.WriteLine(Descripcion);
}

// Comprueba que los códigos tienen 6 dígitos y notifica el resultado con los delegados de Digi21.Tasks.
sealed class ValidadorCodigos
{
    public event ProgressEventHandler ProgressChanged;
    public event ResultsAddedEventHandler ResultsAdded;
    public event TaskAddedEventHandler TaskAdded;

    public void Valida(string[] codigos, string archivo)
    {
        var errores = new List<ITask>();
        for (var i = 0; i < codigos.Length; i++)
        {
            var codigo = codigos[i];
            if (codigo.Length == 0)
                errores.Add(new TareaConsola("Código vacío", $"La entidad {i} no tiene código.", TaskSeverity.Error, archivo));
            else if (codigo.Length != 6 || !codigo.All(char.IsAsciiDigit))
                errores.Add(new TareaConsola($"Código {codigo} no válido", $"El código {codigo} no tiene 6 dígitos.", TaskSeverity.Warning, archivo));

            ProgressChanged?.Invoke(this, new ProgressEventArgs((i + 1) * 100 / codigos.Length));
        }

        ResultsAdded?.Invoke(this, new ResultsAddedEventArgs($"{codigos.Length} códigos revisados, {errores.Count} con problemas."));

        if (errores.Count > 0)
        {
            var resumen = new TareaConsola($"{errores.Count} códigos con problemas", "Revisa las subtareas.", TaskSeverity.Message, archivo, errores.ToArray());
            TaskAdded?.Invoke(this, new TaskAddedEventArgs(resumen));
        }
    }
}

En una extensión, la tarea resumen se añade al panel de tareas con Tasks.Add, y el doble clic en una fila llama a Execute.