Короткий ответ «да, вы можете сделать это с Akka.NET»
Как Hans отмечает в своем комментарии:
Слово не слишком заботится о вашей библиотеке. Его интерфейс взаимодействия является однопоточным, любой вызов, который вы делаете из рабочего потока, автоматически привязывается к потоку, которому принадлежит объект Application.
Вы можете использовать диспетчеров в Akka.NET для осуществления контроля над потребностями параллелизма ваших актеров - вы можете read about different types of Akka.NET dispatchers and how they work in our Akka.NET Bootcamp Lesson 2.1.
В вашем случае, вот что я рекомендую вам сделать:
- Создать свой
WordSaveAsActor
на резьбе STA и настроить его на использование CurrentSynchronizationContextDispatcher
в Akka.NET, которые вы можете сделать с помощью конфигурации:
var wordActor = MyActorSystem.ActorOf(Props.Create(() => new WordSaveAsActor(...)).WithDispatcher("akka.actor.synchronized-dispatcher"))
Все сообщения этого актёра процессы будут сделаны автоматически на потоке STA. Мы используем эту технику в других средах STA, таких как пользовательский интерфейс Windows Forms, и это значительно упрощает все.
- Выполняйте всю работу, не требующую COM-компонента Word для других участников, использующих диспетчер по умолчанию (CLR threadpool.) Это может включать любую копию файла, открывать, перемещать и т. д. Когда вам нужно отправить данные или получить данные из слова, вы можете передать этим участникам сообщения на ваш
WordSaveAsActor
.
Как указывает Ханс, если вы не запускаете несколько экземпляров Word параллельно, вы не можете делать больше одной операции одновременно, используя свой COM API. Поэтому, чтобы воспользоваться параллелизмом Akka.NET, вам нужно найти способ использовать несколько участников для распараллеливания частей вашей операции, которые не требуют Word.
Слово не заботится о вашей библиотеке. Его интерфейс взаимодействия является однопоточным, любой вызов, который вы делаете из рабочего потока, автоматически привязывается к потоку, которому принадлежит объект Application. Это будет не быстрее, это будет * медленнее *. Вы могли бы в лучшем случае работать над * разными * документами у разных работников, каждый из которых владеет собственным Приложением. Это ускоряет масштабирование, Word - очень тяжелый процесс. –
Вы не имеете в виду 10000 слов Примеры приложений? Почему это должно быть медленнее, если я просто отправлю пути?У меня странные эффекты и сбои даже при использовании async/wait вместо BackgroundWorker и поиска лучшего решения. –