STA中的Akka.net演员

我需要将不同格式的数千个ms办公文档转换为一种通用格式。 为了加快速度,我将使用akka.net进行并行化。 WordSaveAsActor应该:

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

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

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

汉斯在评论中指出:

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

您可以使用Akka.NET中的调度程序来控制您的actor的并发需求 – 您可以阅读不同类型的Akka.NET调度程序以及它们如何在我们的Akka.NET Bootcamp课程2.1中工作 。

在你的情况下,这是我建议你做的:

  1. 在STA线程上创建WordSaveAsActor并将其配置为使用Akka.NET中的CurrentSynchronizationContextDispatcher ,您可以通过配置来完成:

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

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

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

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