Unterstützung für die Interruptable Bibliothek

Interruptable Bibliothek

In Aspose.Slides 18.4, haben wir die Klassen InterruptionToken und InterruptionTokenSource eingeführt. Sie ermöglichen das Unterbrechen von langlaufenden Vorgängen wie Deserialisierung, Serialisierung und Rendering.

Das folgende Code‑Snippet demonstriert das Unterbrechen einer laufenden Aufgabe:

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); // führt die Aktion in einem separaten Thread aus
    Thread.Sleep(10000);            // Zeitüberschreitung
    tokenSource.Interrupt();        // stoppt die Konvertierung
}

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

.NET CancellationToken und Interruptable Bibliothek

Wenn Sie einen CancellationToken zusammen mit der Aspose.Slides Interruptible‑Bibliothek verwenden müssen, wickeln Sie die Verarbeitung der Presentation ein und unterbrechen Sie das [InterruptionToken], wenn CancellationToken.IsCancellationRequested true ist.

Dieser C#‑Code demonstriert die Vorgehensweise:

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); // führt die Aktion in einem separaten Thread aus

    while (!task.Wait(500)) // wartet und überwacht, ob cancellationToken.IsCancellationRequested gesetzt ist
    {
        if (cancellationToken.IsCancellationRequested)
        {
            Console.WriteLine("Presentation processing was canceled");
            tokenSource.Interrupt(); // unterbricht die Präsentationsverarbeitung
        }
    }
}

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

FAQ

Welchen Zweck hat die Aspose.Slides Interrupt-Bibliothek?

Sie bietet einen Mechanismus zum Unterbrechen von langlaufenden Vorgängen – wie dem Laden, Speichern oder Rendern von Präsentationen – bevor sie abgeschlossen sind. Das ist nützlich, wenn die Verarbeitungszeit begrenzt werden muss oder die Aufgabe nicht mehr benötigt wird.

Was ist der Unterschied zwischen InterruptionToken und InterruptionTokenSource?

  • InterruptionToken wird an die Aspose.Slides‑API übergeben und während langlaufender Vorgänge überprüft.
  • InterruptionTokenSource wird in Ihrem Code verwendet, um Token zu erstellen und Unterbrechungen auszulösen, indem Interrupt() aufgerufen wird.

Kann ich .NET CancellationToken mit der Interrupt‑Bibliothek verwenden?

Ja. Sie können den [CancellationToken] in Ihrer Anwendungslogik überwachen und InterruptionTokenSource.Interrupt() aufrufen, wenn eine Abbruchanforderung vorliegt. Dadurch kann Aspose.Slides in standardmäßige .NET‑Abbruch‑Workflows integriert werden.

Welche Vorgänge können unterbrochen werden?

Jeder Aspose.Slides‑Vorgang, der ein InterruptionToken akzeptiert – z. B. das Laden einer Präsentation mit Presentation(path, loadOptions) oder das Speichern mit Presentation.Save(...) – kann unterbrochen werden.

Findet die Unterbrechung sofort statt?

Nein. Die Unterbrechung ist kooperativ: Der Vorgang prüft periodisch das Token und stoppt, sobald er erkennt, dass Interrupt() aufgerufen wurde.

Was passiert, wenn ich Interrupt() aufrufe, nachdem ein Vorgang bereits abgeschlossen ist?

Nichts – der Aufruf hat keine Wirkung, wenn der betreffende Vorgang bereits abgeschlossen ist.

Kann ich dieselbe InterruptionTokenSource für mehrere Vorgänge wiederverwenden?

Ja – aber nachdem Sie Interrupt() für diese Quelle aufgerufen haben, werden alle Vorgänge, die deren Token verwenden, unterbrochen. Verwenden Sie separate Token‑Quellen, um Vorgänge unabhängig zu verwalten.