STA中的Akka.net演员

时间:2015-03-09 10:47:55

标签: c# com ms-word sta akka.net

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

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

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

1 个答案:

答案 0 :(得分:3)

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

汉斯在评论中指出:

  

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

您可以使用Akka.NET中的调度程序来控制您的actor的并发需求 - 您可以read about different types of Akka.NET dispatchers and how they work in our Akka.NET Bootcamp Lesson 2.1

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

  1. 在STA线程上创建WordSaveAsActor并将其配置为使用Akka.NET中的CurrentSynchronizationContextDispatcher,您可以通过配置执行此操作:
  2. var wordActor = MyActorSystem.ActorOf(Props.Create(() => new WordSaveAsActor(...)).WithDispatcher("akka.actor.synchronized-dispatcher"))

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

    1. 在使用默认调度程序(CLR threadpool)的其他actor上执行所有其他不需要Word的COM组件的工作。这可能包括任何文件复制,打开,移动等。当您需要发送数据时要通过Word发送或接收数据,您可以让这些演员将消息传递给您的WordSaveAsActor
    2. 正如Hans指出的那样,除非你并行运行多个Word实例,否则你不可能一次利用其COM API进行多个操作。因此,为了利用Akka.NET的并行性,您需要找到一种方法来使用多个actor来并行化不需要Word的操作部分。