可中断库支持
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 和可中断库
当需要在 Slides 可中断库中使用 CancellationToken 时,如果 cancellationToken.IsCancellationRequested 设置为 true,您可以包装 Presentation 处理并中断 InterruptionToken。
以下 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(); // 中断演示文稿处理
}
}
}
private static Task Run(Action<IInterruptionToken> action, IInterruptionToken token)
{
return Task.Run(() =>
{
action(token);
});
}