支援可中斷函式庫

概述

Aspose.Slides for .NET 提供可中斷的處理機制,用於長時間執行的簡報任務,例如反序列化、序列化和渲染。此機制基於 InterruptionTokenInterruptionTokenSource 類別。

InterruptionToken 可指派給 LoadOptions,並傳遞給 Presentation 建構函式。當呼叫 InterruptionTokenSource.Interrupt() 時,相關的長時間執行任務會被中斷。本文亦示範如何結合標準 .NET CancellationToken 使用此機制,透過監控取消請求,並在需要取消時呼叫 Interrupt()

可中斷函式庫

Aspose.Slides 18.4 中,我們推出了 InterruptionTokenInterruptionTokenSource 類別。它們讓您能夠中斷長時間執行的任務,例如反序列化、序列化與渲染。

以下程式碼片段示範如何中斷執行中的任務:

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); });
}

.NET CancellationToken 與可中斷函式庫

當您需要在 Aspose.Slides 可中斷函式庫之外,同時使用 CancellationToken 時,請將 Presentation 的處理包裹起來,並在 CancellationToken.IsCancellationRequestedtrue 時呼叫 InterruptionTokenInterrupt()

此 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 cancelled");
            tokenSource.Interrupt(); // 中斷簡報處理
        }
    }
}

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

常見問題

Aspose.Slides 可中斷函式庫的目的為何?

它提供一種機制,可在長時間執行的操作(例如載入、儲存或渲染簡報)完成之前中斷該操作。當處理時間需要受限或任務已不再需要時,這非常有用。

InterruptionTokenInterruptionTokenSource 有何差異?

  • InterruptionToken 會傳遞給 Aspose.Slides API,在長時間執行的操作中被檢查。
  • InterruptionTokenSource 則由您的程式碼使用,以建立 token 並透過呼叫 Interrupt() 觸發中斷。

可以在 .NET 中同時使用 CancellationToken 與可中斷函式庫嗎?

可以。您可以在應用程式邏輯中監控 [CancellationToken],當需要取消時呼叫 InterruptionTokenSource.Interrupt(),從而讓 Aspose.Slides 與標準 .NET 取消工作流程整合。

哪些任務可以被中斷?

任何接受 InterruptionToken 的 Aspose.Slides 任務——例如使用 Presentation(path, loadOptions) 載入簡報,或使用 Presentation.Save(...) 儲存——都可以被中斷。

中斷會立即發生嗎?

不會。中斷是合作式的:操作會定期檢查 token,並在偵測到已呼叫 Interrupt() 後立即停止。

如果在任務已完成後呼叫 Interrupt(),會發生什麼?

不會有任何影響——若相應任務已完成,呼叫將不產生作用。

可以將相同的 InterruptionTokenSource 重複使用於多個任務嗎?

可以,但在對該來源呼叫 Interrupt() 後,所有使用其 token 的任務皆會被中斷。若需獨立管理任務,請使用不同的 token 來源。