2014-01-13 5 views
2

У меня есть служба Windows для выполнения фонового процесса. Эта служба Windows будет взаимодействовать с веб-сайтом asp.net. Функциональность приведена ниже.Windows service and design pattern

На моем сайте 3 действия. Пользователь может выбрать задачу (предположим, что есть три кнопки). Затем он вызовет службу Windows. Остальная часть операции выполняется службой Windows. Пользователь может выйти с веб-сайта, но он запустит службу в фоновом режиме. Как только он будет завершен, он внесет соответствующие изменения в базу данных. Мне нужно знать, могу ли я применить любой шаблон дизайна к сервису Windows (заводская, абстрактная фабрика и т. Д.). Я читал о разных шаблонах дизайна, но я действительно смущен тем, как это применимо к проекту. В настоящее время я пишу весь код в событиях OnStart и OnStop службы Windows. Пожалуйста, направляйте меня.

Спасибо.

+1

По крайней мере вам нужно начать, создав в поточном потоке метод OnStart. В идеале метод OnStart должен быть немедленно завершен. В противном случае, когда вы запустите службу, она будет висеть с сообщением «Запуск» до истечения времени ожидания. Похоже, вы, возможно, захотите изучить некоторые базовые обучающие программы и опубликовать конкретные проблемы, которые у вас есть. [Это] (http://stackoverflow.com/a/12886071/724591) является основным использованием таймера. – matth

+0

Большое спасибо за ответ. Это было действительно полезно. В настоящее время я создаю несколько экземпляров службы для обработки нескольких пользователей, которые вошли на веб-сайт. Теперь я думаю, вместо того, чтобы создавать несколько экземпляров службы, я могу создать новый поток для запроса от другого пользователя ... rt? (Одна служба и несколько потоков). Я также могу ограничить количество новых потоков, которые будут созданы. Это правильный подход? – Dev

+0

и как насчет дизайна? Моя логика обслуживания содержит некоторые операции с db и некоторый статический класс с массивом только для чтения. Есть ли какая-то конкретная роль для дизайна? Я немного запутался в его использовании .--> Спасибо. – Dev

ответ

4

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

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

Класс обслуживания:

public partial class Service : ServiceBase 
{ 
    private Processor _processor; 

    public Service() { InitializeComponent(); } 

    protected override void OnStart(string[] args) 
    { 
     _processor = new Processor(); 
     new System.Threading.Thread(_processor.Run).Start(); 
    } 

    protected override void OnStop() 
    { 
     _processor.Stop(); 
    } 
} 

Процессор:

public class Processor 
{   
    private bool _continue; 
    private List<UserProcessor> _userProcessors; // List of users being processed. 

    public void Run() 
    { 
     _continue = true; 
     while (_continue) 
     { 
      var users = getUsersToProcess(); 
      foreach (User user in users) 
      { 
       if (_userProcessors.Any(u => u.UserId == user.UserId) == false) 
       { 
        // Start a new processor for the user since it wasn't found. 
        var processor = new UserProcessor(user); 
        new System.Threading.Thread(processor.Run).Start(); 
        _userProcessors.Add(processor); 
       } 
      } 

      System.Threading.Thread.Sleep(1000); 
     } 
    } 

    public void Stop() 
    { 
     _continue = false; 

     foreach (var processer in _userProcessors) 
      processer.Stop(); 
    } 

    private List<User> getUsersToProcess() { throw new NotImplementedException(); } 
} 

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

+0

У меня наверняка есть попытка ... спасибо за быстрый ответ ... – Dev

+0

@Dev, вы также можете проверить [Обзор кода] (http://codereview.stackexchange.com/), если у вас есть рабочий пример что вы хотите критиковать. – matth

+1

@ making3, вы пропустили код, чтобы добавить UserProcessor в коллекцию _userProcessors после вызова его запуска задачи Run? – samneric