3

我需要将数千个不同格式的 ms office 文档转换为一种通用格式。为了让事情变得更快,我会使用 akka.net 来并行化它。WordSaveAsActor 应该:

  • 在单线程公寓中运行
  • 持有 Word 应用程序实例
  • 在此实例上进行 COM 调用,例如 SaveAs(..) 使用来自多个并行线程的接收消息的路径
  • 因任何崩溃而重新启动

甚至可以在 STA 中运行 akka.net 演员吗?如果我以这种方式使用 akka.net,有什么顾虑吗?

4

1 回答 1

3

简短的回答是“是的,你可以用 Akka.NET 做到这一点”

正如汉斯在评论中指出的那样:

Word 不太关心您的图书馆。它的互操作接口是单线程的,您从工作线程进行的任何调用都会自动编组到拥有 Application 对象的线程。

您可以使用 Akka.NET 中的调度程序对参与者的并发需求进行一些控制 - 您可以在我们的 Akka.NET 训练营课程 2.1 中了解不同类型的 Akka.NET 调度程序以及它们如何工作

就您而言,这是我建议您执行的操作:

  1. WordSaveAsActor在 STA 线程上创建您的线程并将其配置为使用CurrentSynchronizationContextDispatcherAkka.NET,您可以通过配置来执行此操作:

var wordActor = MyActorSystem.ActorOf(Props.Create(() => new WordSaveAsActor(...)).WithDispatcher("akka.actor.synchronized-dispatcher"))

该参与者处理的所有消息都将在 STA 线程上自动完成。我们在其他 STA 环境中使用此技术,例如 Windows 窗体 UI,它极大地简化了一切。

  1. 在使用默认调度程序(CLR 线程池)的其他参与者上执行不需要 Word 的 COM 组件的所有其他工作。这可能包括任何文件复制、打开、移动等。当您需要向或接收数据时来自 word 的数据,您可以让这些参与者将消息传递给您的WordSaveAsActor.

正如 Hans 所指出的,除非您并行运行多个 Word 实例,否则您实际上不能一次利用其 COM API 执行多个操作。因此,为了利用 Akka.NET 的并行性,您需要找到一种方法来使用多个参与者来并行化不需要 Word 的操作部分。

于 2015-03-09T20:11:08.367 回答