Akka.net STA 中的演员

Akka.net actors in STA

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

甚至可以 运行 akka.net STA 中的演员吗?如果我这样使用 akka.net 会有任何顾虑吗?

简短的回答是"yes, you can do this with Akka.NET"

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

Word doesn't care much about your library. Its interop interface is single-threaded, any call you make from a worker thread is automatically marshaled to the thread that owns the Application object.

您可以使用 Akka.NET 中的调度程序来对您的参与者的并发需求进行一些控制 - 您可以 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,您可以通过配置来完成:

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

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

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

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