Поддержка библиотеки Interruptable
Библиотека Interruptable
В Aspose.Slides 18.4 мы представили классы InterruptionToken и InterruptionTokenSource. Они позволяют прерывать длительные операции, такие как десериализация, сериализация и рендеринг.
- InterruptionTokenSource — источник токена(ов), передаваемых в ILoadOptions.InterruptionToken.
- Когда ILoadOptions.InterruptionToken установлен и экземпляр LoadOptions передаётся в конструктор Presentation, вызов InterruptionTokenSource.Interrupt() прерывает любую длительную задачу, связанную с этой Presentation.
Следующий фрагмент кода демонстрирует прерывание выполняющейся задачи:
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); // запустить действие в отдельном потоке
Thread.Sleep(10000); // тайм-аут
tokenSource.Interrupt(); // остановить конвертацию
}
private static void Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
Task.Run(() => { action(token); });
}
CancellationToken .NET и библиотека Interruptable
Когда необходимо использовать CancellationToken совместно с прерываемой библиотекой Aspose.Slides, оберните обработку Presentation и прерывайте InterruptionToken, если CancellationToken.IsCancellationRequested равно true.
Этот пример на C# показывает, как это работает:
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); // запустить действие в отдельном потоке
while (!task.Wait(500)) // ожидать и отслеживать, установлен ли cancellationToken.IsCancellationRequested
{
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("Presentation processing was canceled");
tokenSource.Interrupt(); // прервать обработку презентации
}
}
}
private static Task Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
return Task.Run(() =>
{
action(token);
});
}
FAQ
Какова цель библиотеки прерывания Aspose.Slides?
Она предоставляет механизм прерывания длительных операций — загрузки, сохранения или рендеринга презентаций — до их завершения. Это полезно, когда требуется ограничить время обработки или задача более не нужна.
В чём разница между InterruptionToken и InterruptionTokenSource?
InterruptionTokenпередаётся в API Aspose.Slides и проверяется во время длительных операций.InterruptionTokenSourceиспользуется в вашем коде для создания токенов и вызова прерывания черезInterrupt().
Можно ли использовать .NET CancellationToken с библиотекой прерывания?
Да. Вы можете отслеживать CancellationToken в логике приложения и вызывать InterruptionTokenSource.Interrupt(), когда требуется отмена. Это позволяет Aspose.Slides интегрироваться со стандартными процессами отмены в .NET.
Какие задачи можно прерывать?
Любая задача Aspose.Slides, принимающая InterruptionToken — например, загрузка презентации через Presentation(path, loadOptions) или сохранение через Presentation.Save(...) — может быть прервана.
Прерывание происходит мгновенно?
Нет. Прерывание кооперативное: операция периодически проверяет токен и останавливается, как только обнаруживает вызов Interrupt().
Что произойдёт, если вызвать Interrupt() после завершения задачи?
Ничего — вызов не имеет эффекта, если соответствующая задача уже завершена.
Можно ли повторно использовать один InterruptionTokenSource для нескольких задач?
Да — но после вызова Interrupt() на этом источнике все задачи, использующие его токены, будут прерваны. Для независимого управления задачами используйте отдельные источники токенов.