我需要将数千个不同格式的 ms office 文档转换为一种通用格式。为了让事情变得更快,我会使用 akka.net 来并行化它。WordSaveAsActor 应该:
- 在单线程公寓中运行
- 持有 Word 应用程序实例
- 在此实例上进行 COM 调用,例如 SaveAs(..) 使用来自多个并行线程的接收消息的路径
- 因任何崩溃而重新启动
甚至可以在 STA 中运行 akka.net 演员吗?如果我以这种方式使用 akka.net,有什么顾虑吗?
简短的回答是“是的,你可以用 Akka.NET 做到这一点”
正如汉斯在评论中指出的那样:
Word 不太关心您的图书馆。它的互操作接口是单线程的,您从工作线程进行的任何调用都会自动编组到拥有 Application 对象的线程。
您可以使用 Akka.NET 中的调度程序对参与者的并发需求进行一些控制 - 您可以在我们的 Akka.NET 训练营课程 2.1 中了解不同类型的 Akka.NET 调度程序以及它们如何工作。
就您而言,这是我建议您执行的操作:
WordSaveAsActor
在 STA 线程上创建您的线程并将其配置为使用CurrentSynchronizationContextDispatcher
Akka.NET,您可以通过配置来执行此操作:
var wordActor = MyActorSystem.ActorOf(Props.Create(() => new WordSaveAsActor(...)).WithDispatcher("akka.actor.synchronized-dispatcher"))
该参与者处理的所有消息都将在 STA 线程上自动完成。我们在其他 STA 环境中使用此技术,例如 Windows 窗体 UI,它极大地简化了一切。
WordSaveAsActor
.正如 Hans 所指出的,除非您并行运行多个 Word 实例,否则您实际上不能一次利用其 COM API 执行多个操作。因此,为了利用 Akka.NET 的并行性,您需要找到一种方法来使用多个参与者来并行化不需要 Word 的操作部分。