Лучший способ аккуратно закрыть приложение, запущенное через другое - PullRequest
2 голосов
/ 14 мая 2010

Я не смог найти никаких близких ответов на этот вопрос, поэтому я консультируюсь с опытом пользователей SO:

Сценарий:

У меня есть два небольших приложения Winform на C #, одно из которых ведет себя как сервер или хост, а другое - как клиент. Они обмениваются данными через SQL Server с точки зрения параметров конфигурации.

В настоящее время я запускаю клиентское приложение (которое требуется только периодически) из серверного приложения через Process.Start() и завершаю его с помощью Process.CloseMainWindow() (после нахождения его в списке процессов).

Хотя это кажется достаточно чистым, я подумал, есть ли лучший способ.

Вопрос:

Каким способом лучше всего было бы дать команду клиентскому приложению завершить работу:

  • Продолжить использование Process.CloseMainWindow ()?
  • Реализовать WCF между приложениями? (Мне нужна помощь, как это сделать.)
  • Установить переменную в SQL, которую проверяет клиентское приложение?
  • Как-то иначе?

Ответы [ 3 ]

1 голос
/ 16 мая 2010

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

Теперь больше не имеет смысла иметь отдельные программы. Просто попросите сервер создать видимое окно. Взаимодействие тривиально, поскольку все выполняется в одной программе и имеет доступ ко всем состояниям этой программы.

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

using System;
using System.Threading;
using System.Windows.Forms;

static class ClientView {
    private static Form mView;

    public static void Start(Form view) {
        if (Busy) throw new InvalidOperationException("View already running");
        mView = view;
        mView.FormClosed += (o, e) => { mView = null; }
        Thread t = new Thread(() => Application.Run(view));
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }
    public static void Stop() {
        if (Busy) mView.Invoke(new MethodInvoker(() => mView.Close()));
    }
    public static bool Busy { get { return mView != null; } }
}

Пример использования:

ClientView.Start(new ClientForm());
1 голос
/ 16 мая 2010

Учитывая, что Process.Start(string)

Новый Процесс , связанный с ресурсом процесса, или ноль, если ресурс процесса не запущен (например, если существующий процесс используется повторно).

Process myProcess = Process.Start("client.exe");

Затем вы можете использовать это значение для вызова CloseMainWindow:

myProcess.CloseMainWindow();

Единственная перегрузка, которая не возвращает компонент Process, - это метод без параметров .

(Кстати, я не читал комментарии к вопросу до тех пор, пока не опубликовал этот ответ)

1 голос
/ 14 мая 2010
  • Как-то иначе?

Вы можете использовать .Net Remoting .

Однако вам, вероятно, следует использовать WCF.

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