Создание приложения WPF многопроцессным - PullRequest
0 голосов
/ 12 октября 2010

В настоящее время у меня есть многопоточное приложение, которое запускается в следующем порядке:

  1. Запустите и измените файл XML
  2. Работайте
  3. Измените XML на значения по умолчанию

Шаг 3 очень важен, и я должен убедиться, что это всегда происходит.Но в случае сбоя приложения я могу получить неправильный XML.

Сценарий, в котором я его использую:

Мое приложение - это небольшая утилита, которая подключается к удаленному устройству, но на той же машине есть работающая служба, которая подключена к той же самойудаленное устройство, к которому я хочу подключиться.Сервис предоставляет метод restartService и во время запуска в зависимости от данных XML он подключается к удаленному устройству или нет.Итак, в конце я должен убедиться, что что бы ни случилось с моим приложением, XML устанавливается в состояние по умолчанию.

Я подумал, что поток работает как отдельный процесс и каждые n секунд проверяет, жив ли основной процесси ответ будет решить эту проблему.Но я нашел очень мало примеров многопроцессорных приложений на C #.Поэтому, если бы кто-то мог показать пример того, как создать поток, который выполняется как отдельный процесс, это было бы замечательно.

Что, если я создаю отдельное приложение для консольного проекта.Он скомпилирован в отдельный исполняемый файл и запускается из основного приложения.Затем используйте IpcChannel для связи между 2 процессами.Или создайте приложение WCF.Будет ли работать один из этих подходов?

Ответы [ 5 ]

2 голосов
/ 12 октября 2010

A Thread принадлежит Process, поэтому, если процесс умирает, то делают все его потоки.Предполагается, что каждое приложение представляет собой отдельный процесс, и хотя вы можете запускать дополнительные процессы, оно звучит как сложное решение для простой проблемы.

Вместо того, чтобы изменять и возвращать файл, вы можете просто прочитать его в памятьи оставить файловую систему в покое?

1 голос
/ 12 октября 2010

Вы можете подписаться на событие с именем DispatcherUnhandledException, чтобы при возникновении необработанного исключения вы могли безопасно отменить настройки XML.

 public partial class App : Application
{
    public App()
    {
        this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
    }

    void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
    {
        //When ever an Unhandeled exception is thrown

        // You can change your XML files to default values.
    }

}

// Если вы убили процесс через диспетчер задач

AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit);

void CurrentDomain_ProcessExit(object sender, EventArgs e)
    {
        // Change your Settings Here.
    }

// Если вы инициировали Windows ShutDown

this.SessionEnding += new SessionEndingCancelEventHandler(App_SessionEnding);

  void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
    {
        // XML Changes
    }
0 голосов
/ 12 октября 2010

Я думаю, что, является ли приложение многопоточным или многопроцессорным, или что-то еще, на самом деле не является проблемой, которую вам нужно решить. Реальная проблема заключается в следующем: как сделать эту операцию атомарной?

Когда вы говорите, что вам нужно убедиться, что шаг 3 всегда происходит, вы на самом деле говорите, что ваша программа должна выполнить атомарную транзакцию: либо все это происходит, либо ничего не происходит.

Чтобы достичь этого, ваш процесс должен быть спроектирован так, как планируются транзакции базы данных. Он должен начать транзакцию, выполнить работу, а затем либо зафиксировать транзакцию, либо откатить ее. Процесс должен быть спроектирован таким образом, чтобы, если при запуске он обнаружил, что транзакция была начата, а не зафиксирована или откатана более ранним запуском, он должен начать с отката этой транзакции.

Важно отметить, что метод commit должен иметь как можно меньшую нестабильность. Например, типичным способом разработки транзакционного процесса является использование файловой системы: создайте временный файл, чтобы указать, что транзакция началась, запишите выходные данные во временные файлы, а затем попросите метод commit переименовать временные файлы в их окончательные. имена и удалить файл флага транзакции. Существует риск того, что файловая система выйдет из строя между временем, когда вы переименовали файлы, и временем, когда вы удалили файл флажка (и есть способы уменьшить этот риск тоже), но это гораздо меньший риск, чем вид, который вы описали.

Если вы разрабатываете процесс так, чтобы он реализовывал транзакционную модель, будь то многопроцессорная обработка, многопоточность или однопоточность, это просто детали реализации.

0 голосов
/ 12 октября 2010

Подумайте об установке флага «грязного» в файле конфигурации и сохранении резервной копии XML по умолчанию в другом файле.Когда ваше приложение запускается, оно меняет XML и устанавливает флаг.Если он успешно завершается, он сбрасывает флаг и восстанавливает XML.Ваша служба проверяет флаг, чтобы определить, нужно ли ему использовать последний XML, написанный вашим приложением, или переключиться на файл резервной копии.

0 голосов
/ 12 октября 2010

То, о чем вы говорите, обычно называется «надзором» в мэйнфреймовом вычислительном оборудовании и других инфраструктурах крупных вычислительных систем. Контролируемый процесс - это процесс, который выполняется под надзором процесса супервизора, который перезапускает его или иным образом «исправляет» проблему, если предыдущий отказывает или не может завершить свою работу.

Вы можете увидеть это по тому, как Windows автоматически перезапускает службы, если они перестают работать; это очень упрощенная версия подсистемы наблюдения.

Насколько я понимаю, это сложная область компьютерной инженерии, и я не думаю, что Windows или .NET предоставляют программный интерфейс для этого. В зависимости от ваших конкретных потребностей вы можете разработать простой подход к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...