У меня есть список файлов для шифрования.
Шифрование выполняется внешним приложением консоли, сообщающим о ходе выполнения, которое необходимо проанализировать.Этот прогресс должен быть запущен как асинхронный (Process.BeginOutputReadLine, обрабатывающий событие OutputDataReceived, является единственным способом, которым я могу получить прогресс в реальном времени от этого процесса).
Сценарий:
Для каждого файла, который пользователь выбирает для шифрования,ViewModel
экземпляр, содержащий эту информацию о файле, добавляется в ListBox
.Пользователь добавил 100 файлов для шифрования.Каждый из ViewModel
s имеет команду Encrypt
(я использую Prism DelegateCommand
), которая должна запускаться, когда пользователь нажимает кнопку Зашифровать в элементе списка.
Кроме тогопользователь может выбрать «Зашифровать все», то есть CompositeCommand
в родительском контейнере, который вызывает команду «Шифровать» для каждого отдельного элемента.
Каждый из элементов в списке имеетИндикатор выполнения, указывающий процесс шифрования для этого отдельного файла, и в родительском контейнере также есть индикатор выполнения, который должен отображать общий прогресс.
Я создал оболочку, которая асинхронно вызывает этот процесс и вызывает событие .NET напри каждом изменении прогресса виртуальная машина обрабатывает это событие и обновляет свое свойство прогресса, с которым связана индикатор выполнения, и это событие также обрабатывается родительским контейнером, который сбрасывает итоговый общий индикатор выполнения при каждом изменении прогресса.
Эта оболочка предоставляетФункция «EncryptAsync», которая запускает базовый процесс.
Каждый из элементов (виртуальных машин)имеет оболочку, и когда вызывается команда Encrypt, он вызывает этот метод для оболочки, которая затем создает процесс и т. д.
Таким образом, в основном, когда пользователь нажимает кнопку Encrypt All, запускается 100 процессов.
Просто чтобы убедиться, что шифрование каждого файла может занять до 10 минут и даже больше.Среднее значение - минута или меньше.
Сейчас Моя проблема :
- Как ограничить количество одновременных процессов (нужно ли?возможно я должен зашифровать их 1 на 1)?
- Это эффективный способ сделать это?Может быть, существует совершенно другой и лучший подход?
- Как мне убедиться, что все эти процессы (которые находятся в оболочках, которые находятся в виртуальных машинах) открыты, когда ViewModel закрывается (я сделал все, что могвнутренне распределяя ресурсы (т.е. сам процесс шифрования) после шифрования, но я заставил оболочку реализовать
IDisposable
, я не уверен, что реализация IDisposable
на виртуальной машине будет правильным способом, я ошибаюсь.
Любой дизайн или практическое руководство / ссылки на образцы по этой истории будут очень благодарны!
* Утилизация