Soporte para Biblioteca Interrumpible

Biblioteca Interrumpible

En Aspose.Slides 18.4, añadimos la clase InterruptionToken y la clase InterruptionTokenSource. Proporcionan soporte para la interrupción de tareas de larga duración, como deserialización, serialización o representación.

  • InterruptionTokenSource representa la fuente del token o múltiples tokens pasados a ILoadOptions.InterruptionToken.
  • Cuando se establece ILoadOptions.InterruptionToken y la instancia de LoadOptions se pasa al constructor de Presentation, invocar el método InterruptionTokenSource.Interrupt provoca la interrupción de cualquier tarea de larga duración relacionada con la Presentación.

Este fragmento de código a continuación demuestra la interrupción de una tarea en ejecución:

public static void Run()
{
    Action<IInterruptionToken> action = (IInterruptionToken token) =>
    {
        LoadOptions options = new LoadOptions { InterruptionToken = token };
        using (Presentation presentation = new Presentation("pres.pptx", options))
        {
            presentation.Save("pres.ppt", SaveFormat.Ppt);
        }
    };

    InterruptionTokenSource tokenSource = new InterruptionTokenSource();
    Run(action, tokenSource.Token); // ejecutar acción en un hilo separado
    Thread.Sleep(10000);            // tiempo de espera
    tokenSource.Interrupt();        // detener conversión


}
private static void Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
    Task.Run(() => { action(token); });
}

.NET CancellationToken y Biblioteca Interrumpible

Cuando necesite usar el CancellationToken junto con la Biblioteca Interrumpible de Slides, puede envolver el procesamiento de la Presentación e interrumpir InterruptionToken si cancellationToken.IsCancellationRequested está establecido en verdadero.

Este código C# demuestra la operación descrita:

public static void Main()
{
    CancellationTokenSource tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(20));
    ProcessPresentation("pres.pptx", "pres.pdf", tokenSource.Token);
}

static void ProcessPresentation(string path, string outPath, CancellationToken cancellationToken)
{
    Action<IInterruptionToken> action = (IInterruptionToken token) =>
    {
        LoadOptions options = new LoadOptions {InterruptionToken = token};
        using (Presentation presentation = new Presentation(path, options))
        {
            presentation.Save(outPath, SaveFormat.Pdf);
        }
    };
    
    InterruptionTokenSource tokenSource = new InterruptionTokenSource();
    Task task = Run(action, tokenSource.Token); // ejecutar acción en un hilo separado

    while (!task.Wait(500)) // esperar para monitorear si cancellationToken.IsCancellationRequested está establecido. 
    {
        if (cancellationToken.IsCancellationRequested)
        {
            Console.WriteLine("El procesamiento de la presentación fue cancelado");
            tokenSource.Interrupt(); // interrumpir el procesamiento de la Presentación
        }
    }
}

private static Task Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
    return Task.Run(() =>
    {
        action(token);
    });
}