| Комментарии на страничке Братухина Андрея | |
| Ум ленивее чем тело. Ларошфуко |
|
Новости
1 февраля 2006 г.
25 января 2006 г. АрхивИюнь 2006 г.Май 2006 г. |
Мои комментарии
Пример сервиса .NET24 июня 2006 г.Первый шаг для создания сервиса, это создать класс наследника 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.
Транзакционные делегаты8 июня 2006 г.Стандартный способ использования транзакции в 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. |
| Copyright © 2004-2006 Bratuhin Andrey. All rights reserved. | Последние изменения: 02 июля 2006 г. |