C # Process.Start, как предотвратить повторное использование существующего приложения? - PullRequest
5 голосов
/ 19 ноября 2008

Я кодирую функцию в программе, где пользователи могут редактировать документы, хранящиеся в базе данных, она сохраняет документ во временную папку, а затем использует Process.Start для запуска документа в приложении для редактирования, например, в Microsoft Word.

Тогда моему приложению нужно подождать, пока они закроют вызываемый процесс, и заменить документ в базе данных только что отредактированной копией во временной папке.

Следующий код прекрасно работает, если вызываемое приложение еще не запущено:

ProcessStartInfo pInfo = new ProcessStartInfo();
pInfo.FileName=TempFolder + Path.DirectorySeparatorChar + f.Name;
Process p = new Process();
p.StartInfo = pInfo;
p.Start();
//p is null at this point if called application was already running
//i.e. Microsoft Word is re-used instead of starting a fresh copy
p.WaitForInputIdle();
p.WaitForExit();

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

Ответы [ 5 ]

2 голосов
/ 20 ноября 2008

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

Вариант 1:

В этом случае я бы порекомендовал модель оформления заказа / регистрации. Это позволит пользователям «извлекать» файл на свой компьютер, а затем регистрировать его, когда они закончат его обновление. Это имеет ряд преимуществ:

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

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

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

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

Вариант 2:

Смотреть файл, используя FileSystemWatcher или его эквивалент. Это позволит вам следить за файлом, а когда пользователь выполняет операцию сохранения, вы можете зафиксировать базу данных. В конце концов, только если пользователь действительно сохранил файл, который вас интересует при обновлении базы,

0 голосов
/ 20 ноября 2008

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

Таким образом, это в их руках, и мне не нужно полагаться на причуды Process.Start.

Спасибо всем за помощь.

0 голосов
/ 20 ноября 2008

Да, подпишитесь на событие Exited процесса и установите для свойства process.EnableRisingEvents значение true. Тогда ваше приложение ничего не будет делать, пока не сработает событие Exited!

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

Удачи!

0 голосов
/ 20 ноября 2008

Я думаю, что вы используете неправильный метод, чтобы решить проблему. Если вы имеете дело только с текстовыми документами, я полагаю, что вы должны использовать COM-взаимодействие для управления и контроля над словом из своего приложения. С COM вы можете контролировать все в слове, вы сможете открыть документ в слове, и вы будете знать, когда пользователь закрыл его.

0 голосов
/ 20 ноября 2008

Я не уверен насчет запуска нового процесса, но вы рассматривали эту логику для ожидания выхода:

while (Process.IsRunning) {}

в основном просто цикл держателя, пока ваш процесс не завершится.

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