Комментарии на страничке Братухина Андрея
Ум ленивее чем тело. Ларошфуко

Новости

1 февраля 2006 г.
Новый дизайн

25 января 2006 г.
Проект OleDatecs закрыт. Если Вас интересует данный проект, то пишите на мой адрес электронной почты.

Архив

Июнь 2006 г.
Май 2006 г.

eXTReMe Tracker

Мои комментарии

Пример сервиса .NET


Первый шаг для создания сервиса, это создать класс наследника ServiceBase, который будет реализовывать собственно полезную работу сервиса.
	public class ServiceSample : ServiceBase
	{
		Thread _thread = null;	

		public ServiceSample()
		{
			this.ServiceName = "ServiceName1";
		}

		protected override void OnStart()
		{
			_thread = new Thread( new ThreadStart( Execute ) );
			_thread.Start();
		}

		protected void Execute()
		{
			// do something
		}
	}
Второй шаг - это создать класс установщик, который установит Ваш сервис в системе с заданными параметрами и правами.
	[RunInstallerAttribute(true)]
	public class ServiceInstaller: Installer
	{
		private System.ServiceProcess.ServiceInstaller serviceInstaller1;
		private ServiceProcessInstaller processInstaller;

		public ServiceInstaller()
		{
			processInstaller = new ServiceProcessInstaller();
			serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();

			processInstaller.Account = ServiceAccount.LocalSystem;
			serviceInstaller1.StartType = ServiceStartMode.Manual;
			serviceInstaller1.ServiceName = "ServiceName1";

			Installers.Add(serviceInstaller1);
			Installers.Add(processInstaller);
		}
	}
ServiceProcessInstaller выполняет функцию настройки прав и других параметров для данного установщика сервиса. ServiceInstaller - установщик для отдельного сервиса. Данный объект создается для каждого сервиса. Аттрибут [RunInstallerAttribute(true)] указывает, что данный установщик будет вызываться автоматически.

Для установки сервиса в системе нужно вызвать утилиту installutil.exe. Например, installutil.exe ServiceSample.exe.

Транзакционные делегаты


Стандартный способ использования транзакции в C#:
using( ITransaction trans = ISession.OpenTransaction() )
{
	trans.Commit();
	// or Rollback();
}
Такой способ не гарантирует вызов Commit, так как программист (в том числе и я) может забыть вставить этот вызов.
Для решения этой проблемы можно использовать код, подобный этому:
With.Transaction( delegate {
	
	// code
	
});
где код класса With такой:
public static class With
{
	public static void Transaction( Proc method )
	{
		using( ITransaction trans = ISession.OpenTransaction() )
		{
			try
			{
				method();
				trans.Commit();
			}
			catch( DbException ex )
			{
				trans.Rollback();
			}
		}
	}
}
Такой способ использования анонимных делегатов можно применить и в других случаях, где требуется предварительный или последующий вызов предопределенных методов.
Подсмотрел у Ayende @ Blog.

 
Web andrey-bratuhin.narod.ru
Последние изменения: 02 июля 2006 г.
Сайт управляется системой uCoz