Комментарии на страничке Братухина Андрея | |
Ум ленивее чем тело. Ларошфуко |
|
Новости
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 г. |