Поддержка прерываемой библиотеки
Contents
[
Hide
]
Прерываемая библиотека
В 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("pres.pptx", options))
{
presentation.Save("pres.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); });
}
.NET CancellationToken и прерываемая библиотека
Когда вам необходимо использовать CancellationToken совместно с прерываемой библиотекой Slides, вы можете обернуть обработку Presentation и прервать InterruptionToken, если cancellationToken.IsCancellationRequested установлен в true.
Этот код C# демонстрирует описанную операцию:
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); // запускаем действие в отдельном потоке
while (!task.Wait(500)) // ждем, чтобы отследить, установлен ли cancellationToken.IsCancellationRequested.
{
if (cancellationToken.IsCancellationRequested)
{
Console.WriteLine("Обработка презентации была отменена");
tokenSource.Interrupt(); // прерываем обработку Presentation
}
}
}
private static Task Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
return Task.Run(() =>
{
action(token);
});
}