Soporte para la biblioteca Interrumpible
Biblioteca Interrumpible
En Aspose.Slides 18.4, introdujimos las clases InterruptionToken y InterruptionTokenSource. Permiten interrumpir tareas de larga duración como deserialización, serialización y renderizado.
- InterruptionTokenSource es la fuente del(los) token(s) que se pasan a ILoadOptions.InterruptionToken.
- Cuando se establece ILoadOptions.InterruptionToken y la instancia de LoadOptions se pasa al constructor de Presentation, invocar InterruptionTokenSource.Interrupt() interrumpe cualquier tarea de larga duración asociada a esa Presentation.
El siguiente fragmento de código muestra cómo interrumpir 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("sample.pptx", options))
{
presentation.Save("sample.ppt", SaveFormat.Ppt);
}
};
InterruptionTokenSource tokenSource = new InterruptionTokenSource();
Run(action, tokenSource.Token); // ejecutar la acción en un hilo separado
Thread.Sleep(10000); // tiempo de espera
tokenSource.Interrupt(); // detener la conversión
}
private static void Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
Task.Run(() => { action(token); });
}
.NET CancellationToken y Biblioteca Interrumpible
Cuando necesite usar un CancellationToken junto con la biblioteca Interrumpible de Aspose.Slides, envuelva el procesamiento de Presentation e interrumpa el InterruptionToken cuando CancellationToken.IsCancellationRequested sea true.
Este código C# demuestra la operación:
public static void Main()
{
CancellationTokenSource tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(20));
ProcessPresentation("sample.pptx", "sample.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 la acción en un hilo separado
while (!task.Wait(500)) // esperar y vigilar si cancellationToken.IsCancellationRequested está activado
{
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("Presentation processing was canceled");
tokenSource.Interrupt(); // interrumpir el procesamiento de la presentación
}
}
}
private static Task Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
return Task.Run(() =>
{
action(token);
});
}
FAQ
¿Cuál es el propósito de la biblioteca interrumpible de Aspose.Slides?
Proporciona un mecanismo para interrumpir operaciones de larga duración —como cargar, guardar o renderizar presentaciones— antes de que se completen. Esto es útil cuando el tiempo de procesamiento debe limitarse o la tarea ya no es necesaria.
¿Cuál es la diferencia entre InterruptionToken y InterruptionTokenSource?
InterruptionTokense pasa a la API de Aspose.Slides y se verifica durante las operaciones de larga duración.InterruptionTokenSourcese utiliza en su código para crear tokens y desencadenar interrupciones llamando aInterrupt().
¿Puedo usar .NET CancellationToken con la biblioteca interrumpible?
Sí. Puede supervisar el CancellationToken en la lógica de su aplicación y llamar a InterruptionTokenSource.Interrupt() cuando se solicite la cancelación. Esto permite que Aspose.Slides se integre con los flujos de cancelación estándar de .NET.
¿Qué tareas pueden interrumpirse?
Cualquier tarea de Aspose.Slides que acepte un InterruptionToken —como cargar una presentación con Presentation(path, loadOptions) o guardar con Presentation.Save(...)— puede interrumpirse.
¿La interrupción ocurre de inmediato?
No. La interrupción es cooperativa: la operación verifica periódicamente el token y se detiene tan pronto como detecta que se ha llamado a Interrupt().
¿Qué ocurre si llamo a Interrupt() después de que una tarea ya haya finalizado?
Nada: la llamada no tiene efecto si la tarea correspondiente ya se ha completado.
¿Puedo reutilizar el mismo InterruptionTokenSource para varias tareas?
Sí, pero después de llamar a Interrupt() en esa fuente, todas las tareas que usan sus tokens serán interrumpidas. Use fuentes de tokens separadas para gestionar las tareas de forma independiente.