Единственный раз, когда я устанавливаю несколько экземпляров служб, используется для нескольких сред, таких как разработка, тестирование и производство. В противном случае он должен храниться в одной службе, предполагая, что весь код логически релевантен.
Что касается шаблона проектирования, я выполнял простой «шаблон» для большинства сервисов, которые я создаю. Я поощряю ответы, поскольку сам я не знаю, хорошо ли это. В основном это связано с созданием начального потока, который немедленно запускается, и дочерних потоков на основе того, что нужно сделать. Для вашей ситуации ниже может быть простой макет обслуживания для пользовательского процессора.
Класс обслуживания:
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 почти установки такой же, как процессор, но с другим кодом внутри время цикла. Здесь вы будете взаимодействовать с базой данных, но я позволю вам понять эту часть.
По крайней мере вам нужно начать, создав в поточном потоке метод OnStart. В идеале метод OnStart должен быть немедленно завершен. В противном случае, когда вы запустите службу, она будет висеть с сообщением «Запуск» до истечения времени ожидания. Похоже, вы, возможно, захотите изучить некоторые базовые обучающие программы и опубликовать конкретные проблемы, которые у вас есть. [Это] (http://stackoverflow.com/a/12886071/724591) является основным использованием таймера. – matth
Большое спасибо за ответ. Это было действительно полезно. В настоящее время я создаю несколько экземпляров службы для обработки нескольких пользователей, которые вошли на веб-сайт. Теперь я думаю, вместо того, чтобы создавать несколько экземпляров службы, я могу создать новый поток для запроса от другого пользователя ... rt? (Одна служба и несколько потоков). Я также могу ограничить количество новых потоков, которые будут созданы. Это правильный подход? – Dev
и как насчет дизайна? Моя логика обслуживания содержит некоторые операции с db и некоторый статический класс с массивом только для чтения. Есть ли какая-то конкретная роль для дизайна? Я немного запутался в его использовании .--> Спасибо. – Dev