Лучший способ ждать службы WCF? - PullRequest
5 голосов
/ 12 января 2011

Я делаю базовую самостоятельную службу WCF, и мне просто интересно, как лучше всего подождать, пока она принимает запросы? Все основные учебные пособия, которые я нашел, просто используют Console.ReadLine, чтобы дождаться, когда пользователь нажмет ввод для выхода. Это не кажется очень практичным для реального применения. Я пытался некоторое время (правда); цикл, но он потребляет все доступные циклы процессора, поэтому это не вариант. Я также попробовал Thread.Sleep (0), но служба не будет принимать запросы во время сна, поэтому это также не сработало. Я уверен, что есть какой-то распространенный способ заставить вашу программу "зависать" для ожидания запросов WCF; кто-нибудь знает как?

Я использую C #, .NET 3.5 sp1.

Ответы [ 4 ]

7 голосов
/ 12 января 2011

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

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

7 голосов
/ 12 января 2011

Если у вас это работает в отдельном потоке (так как он сам размещен), простой вариант - использовать ManualResetEvent.

Просто позвоните manualResetEvent.WaitOne(); в ветке WCF. Это будет блокировать (как Console.ReadLine), пока manualResetEvent.Set() не будет вызван из отдельного потока.

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

0 голосов
/ 30 июня 2017

Службу WCF легко запустить в консольном приложении.Я не мог заставить самостоятельно размещенный WCF работать в службе Windows.Вероятно, слишком много проблем с безопасностью для решения.Чтобы улучшить примеры размещения службы консольного приложения, я создаю метод AttachService, который выполняется в своем собственном потоке, например:

public static AutoResetEvent manualReset;

// Host the service within this EXE console application.
public static void Main()
{
  manualReset = new AutoResetEvent(false);

  ThreadPool.QueueUserWorkItem(AttachService);

  //put Set() signal in your logic to stop the service when needed
  //Example:
  ConsoleKeyInfo key;
  do
  {
    key = Console.ReadKey(true);
  } while (key.Key != ConsoleKey.Enter);
  manualReset.Set();
}
static void AttachService(Object stateInfo)
{
  // Create a ServiceHost for the CalculatorService type.
  using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), new Uri("net.tcp://localhost:9000/servicemodelsamples/service")))
  {
    // Open the ServiceHost to create listeners and start listening for messages.
    serviceHost.Open();

    // The service can now be accessed.

    //Prevent thread from exiting
    manualReset.WaitOne(); //wait for a signal to exit
    //manualReset.Set();
  }
}

Моя цель - запустить это консольное приложение из службы Windows, используя класс Processметод OnStart.Спасибо @Reed Copsey за предложение о WaitOne ().

0 голосов
/ 08 мая 2013

использование BcakgroundWorker это очень хорошее решение.

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