Как продолжить выполнение кода только после завершения службы Windows? - PullRequest
1 голос
/ 29 апреля 2011

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

Thread thread = new Thread(new ThreadStart(ExecyuteLongRunningMethod));
thread.Start();
thread.Join();

Выше в стеке вызовов (когда этот код выполняется) появляется окно с сообщением о результате операции.

Однако, пока этот блоккод выполняется (ExecuteLongRunningMethod вызывает Windows svc), всплывающее окно с сообщением о том, что в результате операции ничего не изменилось, но, поскольку это происходит до завершения выполнения кода, указанного выше, появляется неправильное окно сообщения.1008 * Таким образом, вопрос в том, что было бы правильным способом продолжить выполнение только в приложении winforms (это то, что вызывает Windows SVC), ТОЛЬКО после завершения службы Windows?Я думаю, что приведенный выше подход неверен, так как поток будет вызывать службу Windows (другой процесс), поэтому, пока служба Windows делает свое дело, мой код (приложение winforms) будет продолжаться.Требуется ли какая-то сигнализация или что-то вроде именованных каналов?

Приложение находится в .NET 3.5.

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 апреля 2011

Предоставьте статус выполнения вашей службы через API WCF и вызовите его с помощью netTcp или именованных каналов, вы можете опросить службу или использовать CallBack WCF.

0 голосов
/ 29 апреля 2011

Почему бы вам не использовать BackgroundWorker, чтобы вы могли установить событие для его завершения?
В методе запуска Backgroundworker вы можете запустить службу и дождаться события ручного сброса (например) или мьютекса и,когда он получен, вы можете выйти из метода main.
Таким образом, событие OnCompleted вызывается в вашем основном потоке (например, в пользовательском интерфейсе), и работа завершена ...

В вашем приложении добавьте Backgroundworker и назовите его bgw.
Тогда вы можете сделать:

private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
    // 1. Run the service
    // 2. Wait for mutex
}

private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Here you can handle the end of the service
    // and return the status in main thread
}
...