Поддержка библиотеки Interruptable

Библиотека Interruptable

В Aspose.Slides 18.4 мы представили классы InterruptionToken и InterruptionTokenSource. Они позволяют прерывать длительные операции, такие как десериализация, сериализация и рендеринг.

Следующий фрагмент кода демонстрирует прерывание выполняющейся задачи:

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() на этом источнике все задачи, использующие его токены, будут прерваны. Для независимого управления задачами используйте отдельные источники токенов.