可中断库支持
Contents
[
Hide
]
可中断库
在 Aspose.Slides 18.4 中,我们引入了 InterruptionToken 和 InterruptionTokenSource 类。它们允许您中断诸如反序列化、序列化和渲染等长时间运行的任务。
- InterruptionTokenSource 是传递给 ILoadOptions::set_InterruptionToken 的令牌的来源。
- 当设置了 ILoadOptions::set_InterruptionToken 并将 LoadOptions 实例传递给 Presentation 构造函数时,调用 InterruptionTokenSource::Interrupt() 会中断与该 Presentation 关联的任何长时间运行的任务。
以下代码片段演示了如何中断正在运行的任务:
void Run(Action<SharedPtr<IInterruptionToken>> action, SharedPtr<IInterruptionToken> token)
{
auto threadFunction = std::function<void()>([&action, &token]() -> void
{
action(token);
});
auto thread = System::MakeObject<Threading::Thread>(threadFunction);
thread->Start();
}
void Run()
{
String dataDir = GetDataPath();
auto function = std::function<void(SharedPtr<IInterruptionToken> token)> ([&dataDir](SharedPtr<IInterruptionToken> token) -> void
{
auto options = System::MakeObject<LoadOptions>();
options->set_InterruptionToken(token);
auto presentation = System::MakeObject<Presentation>(dataDir + u"sample.pptx", options);
presentation->Save(dataDir + u"sample.ppt", Export::SaveFormat::Ppt);
});
auto action = System::Action<SharedPtr<IInterruptionToken>>(function);
auto tokenSource = System::MakeObject<InterruptionTokenSource>();
Run(action, tokenSource->get_Token()); // 在单独的线程中运行操作
Threading::Thread::Sleep(10000); // 超时
tokenSource->Interrupt(); // 停止转换
}
常见问题
Aspose.Slides 中断库的目的是什么?
它提供了一种机制,可在加载、保存或渲染演示文稿等长时间运行的操作完成之前中断它们。当处理时间必须受限或任务已不再需要时,这非常有用。
InterruptionToken 与 InterruptionTokenSource 有何区别?
InterruptionToken被传递给 Aspose.Slides API 并在长时间运行的操作期间进行检查。InterruptionTokenSource在您的代码中用于创建令牌,并通过调用Interrupt()来触发中断。
哪些任务可以被中断?
任何接受 InterruptionToken 的 Aspose.Slides 任务——例如使用 Presentation(path, loadOptions) 加载演示文稿或使用 Presentation::Save(...) 保存——都可以被中断。
中断会立即发生吗?
不会。中断是协作式的:操作会定期检查令牌,并在检测到已调用 Interrupt() 时立即停止。
如果在任务已经完成后调用 Interrupt(),会发生什么?
没有任何影响——如果相应的任务已经完成,调用将不起作用。
我可以在多个任务中复用同一个 InterruptionTokenSource 吗?
可以——但在对该源调用 Interrupt() 后,使用其令牌的所有任务都会被中断。请使用不同的令牌源来独立管理任务。