簡體   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