繁体   English   中英

STA中的Akka.net演员

[英]Akka.net actors in STA

我需要将成千上万种不同格式的Office文档转换为一种通用格式。 为了使事情更快,我将使用akka.net对其进行并行化。 WordSaveAsActor应该:

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

甚至可以在STA中运行akka.net actor吗? 如果我以这种方式使用akka.net,是否有任何担忧?

简短的答案是“是的,您可以使用Akka.NET做到这一点”

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM